2016-03-24 8 views
-1

Ich muss die Anzahl der einzelnen Elemente aus dieser Tabelle zählen, aber das distinct ist über viele Spalten in einer Variablen bestückt. Dies ist 2 req.SQL Server: SELECT mit DISTINCT auf Variable mehrere Spalten

Req 1:

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

Req 2:

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

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

Aber das Ergebnis dieser 2 req ist anders!

  • Ergebnis req 1: 45205
  • Ergebnis req 2: 1
+4

'distinct' ist ** nicht ** eine Funktion! Ihre zweite Anweisung zählt die Anzahl der verschiedenen Strings in der Variablen - die per Definition ist 1 –

+0

in req 2 entfernen Distinct Sie erhalten das gleiche wie req 1 – mohan111

+0

Ich muss die Anzahl der einzelnen Elemente aus dieser Tabelle zählen, aber die distinct ist über viele Spalten in einem Varibale auf Lager. Wenn ich Distinct entferne, werde ich die Zählung aller –

Antwort

1

In "req2" können Sie die Prüfsumme des Strings sind unter 'code_paiement, id_emetteur, id_liaison', die immer sein wird, die gleichen, und das Zählen der unterschiedlichen Werte davon, die immer 1.

Betrachten sie es so sein wird: Code reduziert sich auf:

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

... das ist das gleiche wie:

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

Sie sind also die Anzahl der unterschiedlichen Vorkommen der Zahl -1998057055 in der Tabelle für jede Zeile zu zählen; Da der Wert für jede Zeile gleich ist, gibt es nur ein unterschiedliches Vorkommen.

Wenn Sie Ihren SQL-Code wirklich dynamisch erstellen müssen (in der Regel sollten Sie dies vermeiden, indem Sie Ihr Design ändern), sollten Sie etwas wie exec oder sp_executesql verwenden. Ein triviales Beispiel:

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

haben, aber ich muss die Anzahl, die von einer Variablen verschieden ist, auswählen! –

+0

Dann müssen Sie wahrscheinlich dynamische SQL verwenden, um Ihre Aussage zu erstellen. Aber in diesem Fall ist es wahrscheinlich eine gute Zeit, einen Schritt zurückzutreten und sicherzustellen, dass Sie wirklich die richtige Frage stellen oder Ihr tatsächliches Problem auf die richtige Weise lösen. Dynamisches SQL ist im Allgemeinen etwas, das Sie vermeiden sollten. –