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

Write a query to count different kind of records in single line result

我有一个 table,在 MS SQLSERVER

中有 2 列时间戳和 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

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

谢谢

使用 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: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,虽然你需要另一个子查询

动态方式完成:

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