Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:在多个列上使用DISTINCT变量进行选择_Sql_Sql Server_Tsql - Fatal编程技术网

SQL Server:在多个列上使用DISTINCT变量进行选择

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

我需要从这个表中计算不同项的数量,但是不同项超过了存储在变量中的许多列。这是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 (CHECKSUM(@var)))
FROM [DB1].[dbo].[Vo_Fait]
但是这2个请求的结果是不同的

  • 结果要求1:45205
  • 结果要求2:1
在“req2”中,您将获取字符串“code\u paient,id\u emetteur,id\u liance”的校验和,该校验和将始终相同,并计算它的不同值,该值将始终为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通常是您应该避免的。