SQL Server:在多个列上使用DISTINCT变量进行选择
我需要从这个表中计算不同项的数量,但是不同项超过了存储在变量中的许多列。这是2个请求 要求1:SQL Server:在多个列上使用DISTINCT变量进行选择,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要从这个表中计算不同项的数量,但是不同项超过了存储在变量中的许多列。这是2个请求 要求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 (CH
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个请求的结果是不同的
- 结果要求1:45205
- 结果要求2: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\u 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);
distinct
不是一个函数!您的第二个语句统计变量中不同字符串的数量-根据定义,该变量在req 2中为1删除不同您将得到与req相同的结果1我需要从该表中统计不同项目的数量,但不同项超过了存储在变量中的许多列。。如果我删除Distinct,我将拥有ALL计数,但我需要从变量中选择Distinct计数!然后,您可能需要使用动态SQL来构建语句。但在这种情况下,这可能是退一步,确保你真的提出了正确的问题,或以正确的方式解决实际问题的好时机;动态SQL通常是您应该避免的。