Sql 写一个查询来统计单行结果中不同类型的记录
我在Sql 写一个查询来统计单行结果中不同类型的记录,sql,sql-server,sql-server-2008-r2,group-by,sql-server-2012,Sql,Sql Server,Sql Server 2008 R2,Group By,Sql Server 2012,我在mssqlserver TimeStamp ID 2015-05-20 1 2015-05-20 2 2015-05-20 1 2015-05-21 1 2015-05-21 2 2015-05-21 2 2015-05-21 1 我的要求是根据日期计算每个Id的记录数 要求: Date No of records for Id=1 No. records for ID=
mssqlserver
TimeStamp ID
2015-05-20 1
2015-05-20 2
2015-05-20 1
2015-05-21 1
2015-05-21 2
2015-05-21 2
2015-05-21 1
我的要求是根据日期计算每个Id的记录数
要求:
Date No of records for Id=1 No. records for ID=2 Total
2015-05-20 2 1 3
2015-05-21 2 2 4
请让我知道如何才能做到这一点,以及其他专栏
感谢使用Pivot-可以如下所示:
SELECT [TimeStamp], [1] AS [No of records for Id=1], [2] AS [No of records for Id=2], [1]+[2] AS Total
FROM dbo.YourTable
PIVOT
(
COUNT(ID) FOR ID IN ([1],[2])
) pvt
ORDER BY [TimeStamp]
我通过子查询得到了您的答案: SQLFIDDLE:
如果在此处添加id,则需要另一个子查询以动态方式完成:
DECLARE @id_values NVARCHAR(MAX)
DECLARE @stmt NVARCHAR(MAX)
SET @id_values = ''
SET @stmt = ''
--Get List of ID's
SELECT @id_values = @id_values + ',[' + CAST(ID AS VARCHAR) + ']'
FROM dbo.YourTable
GROUP BY ID
SET @id_values = RIGHT(@id_values, LEN(@id_values)-1) --Remove Leading Comma
--Build PIVOT Statement
SET @stmt = 'SELECT [TimeStamp],' + @id_values + ','+ REPLACE(@id_values,',','+') + ' AS Total
FROM dbo.YourTable
PIVOT
(
COUNT(ID) FOR ID IN (' + @id_values + ')
) pvt
ORDER BY [TimeStamp]'
--Execute
EXEC sp_executesql @stmt
是2008年还是2012年?难道你不知道你在使用什么版本的sql server吗?如果您同时需要这两个,那么选择最旧的,因为它的解决方案可能也适用于较新的。另外,请阅读Pivotcreated for people for the people to Testing of the solutions:通常您不会在DB中执行此操作。您需要按日期和ID进行分组计数以获得行,然后让您的报告/消费者确定如何显示它。动态SQL会损害性能和安全性。此外,这种方法可能会导致列数不足(正如其他人所说)。这个数据的目的地是什么?如果id列的值超过了怎么办?那么您必须看看如何动态地构建语句!我用另一个问题回答了这个问题。请看:这可能会显示正确的结果,但最终会导致非常糟糕的性能…它不是可读的代码,也不是动态的…我不是在争论性能或动态,但它为什么不可读?如果你把缩进放对了,它应该是完全可读的,也许它在旁观者的眼中;-)查询设计,新行,小写,大写关键字,缩进,。。。让我们说这是一种艺术——有些喜欢,有些不喜欢,每个人都有自己的风格和喜好
DECLARE @id_values NVARCHAR(MAX)
DECLARE @stmt NVARCHAR(MAX)
SET @id_values = ''
SET @stmt = ''
--Get List of ID's
SELECT @id_values = @id_values + ',[' + CAST(ID AS VARCHAR) + ']'
FROM dbo.YourTable
GROUP BY ID
SET @id_values = RIGHT(@id_values, LEN(@id_values)-1) --Remove Leading Comma
--Build PIVOT Statement
SET @stmt = 'SELECT [TimeStamp],' + @id_values + ','+ REPLACE(@id_values,',','+') + ' AS Total
FROM dbo.YourTable
PIVOT
(
COUNT(ID) FOR ID IN (' + @id_values + ')
) pvt
ORDER BY [TimeStamp]'
--Execute
EXEC sp_executesql @stmt