Erd*_* Ay 2 sql-server group-by datetime
我正在记录一个事件表,并且想要一个输出(如本答案底部所示),问题是我正在获取行中的数据,但希望它们按列显示。
两个维度如下:
我想我必须按时间部分(例如按分钟或每小时)对日期时间值进行分组并检索每个服务器的事件列表,但我不知道如何编写查询?我需要一个by子句吗?
我已经写好了create语句,结构如下:
CREATE TABLE [dbo].[events](
[guidEventId] [uniqueidentifier] PRIMARY KEY,
[dtStart] [datetime2](7) NOT NULL,
[nDirection] [int] NOT NULL,
[nServerId] [int] NOT NULL
)
INSERT INTO events
([guidEventId],[dtStart],[nDirection],[nServerId])
VALUES
(newId(),'2013-08-01 00:01:00','0','1'),
(newId(),'2013-08-01 00:02:00','1','1'),
(newId(),'2013-08-01 00:03:00','0','1'),
(newId(),'2013-08-01 00:04:00','1','2'),
(newId(),'2013-08-02 00:01:00','0','1'),
(newId(),'2013-08-02 00:02:00','1','2'),
(newId(),'2013-08-02 00:03:00','0','2'),
(newId(),'2013-08-02 00:04:00','1','2');
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!6/25e74
茶几应该看起来像这样(白天):
DateTime | Server1 | Server2 | Sum |
--------------------------------------------
2013-08-01 | 3 | 1 | 4 |
2013-08-02 | 1 | 3 | 4 |
Run Code Online (Sandbox Code Playgroud)
小智 5
PIVOT 运算符可能会有所帮助。看看网上的书
例如:
SELECT
DtStart AS Date,
ISNULL([1], 0) AS [Server 1],
ISNULL([2], 0) AS [Server 2],
ISNULL([3], 0) AS [Server 3]
FROM
(
SELECT
DtStart,
nServerID,
NDirection
FROM dbo.events
) AS SourceTable
PIVOT
(
SUM(NDirection)
FOR nServerID IN ([1], [2], [3])
) AS PivotTable
ORDER BY
DtStart ASC
Run Code Online (Sandbox Code Playgroud)