2016-03-24 6 views
-1

Мне нужно подсчитать количество отдельных элементов из этой таблицы, но ядро ​​находится над множеством столбцов, заполненных переменной. Это 2 req.SQL Server: SELECT с DISTINCT на переменном множестве столбцов

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] 

Но результат этого 2 REQ отличается!

  • Результат REQ 1: 45205
  • Результат REQ 2: 1
+4

'отдельный' - ** нет ** a функция! В ваших вторых утверждениях подсчитывается количество различных строк в переменной - по определению 1 –

+0

в req 2 remove Distinct вы получите то же самое, что и req 1 – mohan111

+0

Мне нужно подсчитать количество отдельных элементов из этой таблицы, столбцы, хранящиеся в varibale .. если я удалю Distinct, у меня будет счет всех –

ответ

1

В "req2" вы берете контрольную строку 'code_paiement, id_emetteur, id_liaison', который всегда будет то же самое, и подсчет различных значений ней, которые всегда будут 1.

Подумайте об этом так: ваш код сводится к:

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

... который так же, как:

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

Так вы подсчета числа различных вхождений числа -1998057055 для каждой строки в таблице; поскольку значение одинаково для каждой строки, существует только одно отдельное событие.

Если вам действительно нужно создать свой 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, как правило, вы должны избегать. –