2017-02-21 2 views
0

私は次のコードを持っている:カウント計算フィールドのSQL Server 2012</p> <p>を使用して

Select Distinct [A_number] + '-' + convert(varchar(10),[zone]) As myNumber 
FROM [dbo].[soils]; 

は私が私に各myNumberのカウントを与えるために、このクエリを編集する必要があります。 よろしく、変換からあなたのユニークなmyNumberの数を与えるCOUNT()

SELECT COUNT(DISTINCT [A_number] + '-' + CONVERT(VARCHAR(10),[zone])) 
FROM [dbo].[soils] 

を使用して

答えて

1

group byステートメントを使用しています。そのように行うとindexsの使用を可能にします:

WITH numbers AS (
    SELECT A_number, 
     zone, 
     COUNT(*) AS c 
    FROM dbo.soils 
    GROUP BY A_number, 
     zone 
) 
SELECT A_number + '-' + convert(varchar(10),zone) As myNumber, 
    c AS number_count 
FROM numbers; 
+0

裸の列の操作でグループを行うのが規範的なパターンです。これにより、適切なインデックスを使用することができます。 WHERE句がない場合、このクエリの最適なインデックスの最良の賭けは '(A_number、zone)'の先頭の列を持ちます。 +10。このクエリーが元のものとは異なる結果を返す場合があります。 '( '1 - '、 'a')'と '( '1'、 ' - a')'の '(A_number、zone)'値を持つ行を考えてみましょう。 – spencer7593

0

そして、それぞれのユニークな数のカウントが必要な場合はGROUP BYを考えてください。あなたのフィールドをCONCATすることの結果を使用し、その後

SELECT A_number, 
    zone, 
    COUNT(*) AS c 
FROM dbo.soils 
GROUP BY A_number, 
    zone; 

:私はどうなるのか

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]), COUNT(*) 
FROM [dbo].[soils] 
GROUP BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 
+0

ありがとうございますが、ユニークなmynumberの総数ではなく、それぞれのユニークなmynumberの数が必要です – PeterTheGeo

+0

'GROUP BY'を検討してください – ydoow

0

myNumberの各値に関連付けられた行数を取得DISTINCTを捨て、代わりにGROUP BYを使用するには。

最も簡単な例では、GROUP BY句でSELECTリスト内の式を繰り返します

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) AS myNumber 
    , COUNT(*) AS cnt 
    FROM [dbo].[soils] 
GROUP 
    BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 

些細なセットでは、パフォーマンスが問題になることはありません。大きなセットの場合、パフォーマンスが低下する可能性があります。既存の索引を利用するか、適切な索引を追加するために、問合せを再作成するソリューションがあります。

+0

@ JRLambert:そうです。 DOH!完全に 'COUNT(*)'集合を逃しました。今修正されました。私は 'SUM(1)AS cnt'を使うこともできました。 – spencer7593