编写查询以计算单行结果中的不同类型的记录

时间:2015-05-21 06:18:54

标签: sql sql-server sql-server-2008-r2 group-by sql-server-2012

我在MS SQLSERVER

中有一个包含2列TimeStamp和ID的表
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

请告诉我如何为其他专栏执行此操作。

由于

3 个答案:

答案 0 :(得分:2)

使用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]

答案 1 :(得分:0)

我使用子查询得到了答案:

SQLFIDDLE:http://sqlfiddle.com/#!3/8c28c/5

SELECT DISTINCT t1.myts, 
                (SELECT COUNT(*)
                 FROM mytable t2
                 WHERE t2.myts = t1.myts
                 AND t2.id = 1) AS id_1_count,
                (SELECT COUNT(*)
                 FROM mytable t2
                 WHERE t2.myts = t1.myts
                 AND t2.id = 2) AS id_2_count,
                (SELECT COUNT(*)
                 FROM mytable t2
                 WHERE t2.myts = t1.myts) AS total
FROM mytable t1

如果你在这里添加一个id,你需要另一个子查询

答案 2 :(得分:0)

完成动态方式:

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