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