编写查询以计算单行结果中不同类型的记录
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
我有一个 table,在 MS SQLSERVER
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