2016-03-24 35 views
-1

この表の個別項目の数をカウントする必要がありますが、この区別は変数に格納されている多数の列にあります。これは2 reqです。SQL Server:変数複数列のDISTINCTを使用したSELECT

必須1:

SELECT COUNT(DISTINCT (CHECKSUM(code_paiement,id_emetteur,id_liaison))) 
FROM [DB1].[dbo].[Vo_Fait] 

必須2:

declare @var nvarchar(4000) = 'code_paiement, id_emetteur, id_liaison' 

SELECT COUNT(DISTINCT (CHECKSUM(@var))) 
FROM [DB1].[dbo].[Vo_Fait] 

しかし、この2 REQの結果が違います!

  • 結果REQ 1:45205
  • 結果2 REQ: "REQ2" で1
+4

「distinct」は** not **機能です!あなたの2番目のステートメントは、変数内の別個の文字列の数をカウントします - 定義によって1である –

+0

req 2 remove明確にreq 1と同じになります – mohan111

+0

私はこの表から別個の項目の数を数える必要がありますvaribaleに貯蔵されている列。もし私がDistinctを取り除くなら、私はすべて –

答えて

1

は、あなたが常になります文字列 'code_paiement、id_emetteur、id_liaison' のチェックサムを、取っています同じ、と常に1

される、それの個別の値をカウントがそれをこの方法を考える:

SELECT COUNT(DISTINCT (CHECKSUM('code_paiement,id_emetteur,id_liaison'))) 
FROM [DB1].[dbo].[Vo_Fait] 
:あなたのコードはに減少し同じである

...:だからあなたは、テーブル内のすべての行の番号-1998057055の明確な出現回数をカウントしている

SELECT COUNT(DISTINCT (-1998057055)) 
FROM [DB1].[dbo].[Vo_Fait] 

。値はすべての行で同じであるため、1つの異なるオカレンスしかありません。

実際にSQLコードを動的に作成する必要がある場合(通常はデザインを変更して可能な場合はこれを避ける必要があります)、execまたはsp_executesqlのようなものを使用してください。簡単な例:

DECLARE @var NVARCHAR(4000) = 'code_paiement,id_emetteur,id_liaison'; 
DECLARE @sql NVARCHAR(4000)='SELECT COUNT(DISTINCT(CHECKSUM(' + @var + '))) FROM [DB1].[dbo].[Vo_Fait]'; 
EXEC (@sql); 
+0

の数を持つでしょうが、私は変数から数え離れを選択する必要があります! –

+0

次に、ステートメントを作成するためには、おそらく動的SQLを使用する必要があります。しかしその場合は、一歩踏み込んで本当に正しい質問をしているか、実際の問題を正しい方法で解決しているかどうかを確認するのは良い時期です。動的SQLは一般的に避けるべきです。 –

関連する問題