数据透视不合并 ID 上的行
Pivot not combining rows on ID
我尝试旋转的 table 看起来像这样:
| Timestamp | Userid | Event | message | Id |
------------------------------------------------------
| 2016-09-01 08:40 | 600 | 0 | Created | 1 |
| 2016-09-01 08:41 | 600 | 1 | Started | 1 |
| 2016-09-01 08:42 | 600 | 2 | Completed | 1 |
| 2016-09-01 10:01 | 601 | 0 | Created | 2 |
| 2016-09-01 10:01 | 601 | 1 | Started | 2 |
这是我用来尝试旋转 table 的代码。
with mytable as (
select TimeStamp
,UserId
,event
,message
,Id
from dbname.tablename
where TimeStamp between '2016-09-01' and '2016-10-01'
)
select Id
,[0] as created
,[1] as started
,[2] as completed
,[4] as mismatch_reported
,[5] as reqstd_qty_updated
,[6] as starting_update
,[7] as replaced
from mytable
pivot
(max(timestamp) for event in ([0],[1],[2],[4],[5],[6],[7])) as pivottable
我的预期结果是:
| Id | created | started | completed | mismatch_reported | ... | replaced |
---------------------------------------------------------------------------------------------------
| 1 | 2016-09-01 08:40 | 2016-09-01 08:41 | 2016-09-01 8:42 | NULL | ... | NULL |
| 2 | 2016-09-01 10:01 | 2016-09-01 10:01 | NULL | NULL | ... | NULL |
我得到的结果是将所有时间戳拆分到它们自己单独的行中,ID 如下所示:
| Id | created | started | completed | mismatch_reported | ... | replaced |
---------------------------------------------------------------------------------------------------
| 1 | 2016-09-01 08:40 | NULL | NULL | NULL | ... | NULL |
| 1 | NULL | 2016-09-01 08:41 | NULL | NULL | ... | NULL |
| 1 | NULL | NULL | 2016-09-01 8:42 | NULL | ... | NULL |
| 2 | 2016-09-01 10:01 | NULL | NULL | NULL | ... | NULL |
| 2 | NULL | 2016-09-01 10:01 | NULL | NULL | ... | NULL |
我不知道为什么要这样做。在旋转方面,我是一个菜鸟,但我看到的所有示例都显示了旋转命令的工作方式与我预期的一样。
这个查询中的 pivot 语句出了什么问题?
______________________________________________________________
感谢TT。将我链接到这个! - 这将生成一个示例 table 供您进行故障排除
CREATE TABLE mytable(
TimeStamp VARCHAR(23) NOT NULL PRIMARY KEY
,UserId INTEGER NOT NULL
,event INTEGER NOT NULL
,message VARCHAR(31) NOT NULL
,Id INTEGER NOT NULL
);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:40:11.343',187,0,'Created',5);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:40:30.297',187,1,'Started',5);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:40:30.560',187,2,'Completed',5);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:00.167',238,1,'Started',6);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:41:59.667',238,2,'Completed',6);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:41:55.670',238,0,'Created',6);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:09.297',238,0,'Created',7);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:11.403',238,2,'Completed',7);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:11.843',238,1,'Started',7);
我认为您的实际 table 中有一些附加列,您希望在其上进行数据透视,如果是这样的话,请尝试这样做:
创建一个派生的 table (SourceTable),以过滤您想要的特定列。
declare @a table ([Timestamp] datetime, [Event] int, Id int, a int )
insert into @a values ( '2016-09-01 08:40' , 0 , 1 , 1 )
insert into @a values ( '2016-09-01 08:41', 1 , 1 , 2 )
insert into @a values ( '2016-09-01 08:42', 2 , 1 , 3 )
insert into @a values ( '2016-09-01 10:01', 0 , 2 , 4 )
insert into @a values ( '2016-09-01 10:01' , 1 , 2 , 5 )
select Id
,[0] as created
,[1] as started
,[2] as completed
from
(
select [Timestamp], [Event], Id from @a
) as SourceTable
pivot
(max(timestamp) for event in ([0],[1],[2])) as pivottable;
@a- 您的实际 table 和 SourceTable 派生的 table
我尝试旋转的 table 看起来像这样:
| Timestamp | Userid | Event | message | Id |
------------------------------------------------------
| 2016-09-01 08:40 | 600 | 0 | Created | 1 |
| 2016-09-01 08:41 | 600 | 1 | Started | 1 |
| 2016-09-01 08:42 | 600 | 2 | Completed | 1 |
| 2016-09-01 10:01 | 601 | 0 | Created | 2 |
| 2016-09-01 10:01 | 601 | 1 | Started | 2 |
这是我用来尝试旋转 table 的代码。
with mytable as (
select TimeStamp
,UserId
,event
,message
,Id
from dbname.tablename
where TimeStamp between '2016-09-01' and '2016-10-01'
)
select Id
,[0] as created
,[1] as started
,[2] as completed
,[4] as mismatch_reported
,[5] as reqstd_qty_updated
,[6] as starting_update
,[7] as replaced
from mytable
pivot
(max(timestamp) for event in ([0],[1],[2],[4],[5],[6],[7])) as pivottable
我的预期结果是:
| Id | created | started | completed | mismatch_reported | ... | replaced |
---------------------------------------------------------------------------------------------------
| 1 | 2016-09-01 08:40 | 2016-09-01 08:41 | 2016-09-01 8:42 | NULL | ... | NULL |
| 2 | 2016-09-01 10:01 | 2016-09-01 10:01 | NULL | NULL | ... | NULL |
我得到的结果是将所有时间戳拆分到它们自己单独的行中,ID 如下所示:
| Id | created | started | completed | mismatch_reported | ... | replaced |
---------------------------------------------------------------------------------------------------
| 1 | 2016-09-01 08:40 | NULL | NULL | NULL | ... | NULL |
| 1 | NULL | 2016-09-01 08:41 | NULL | NULL | ... | NULL |
| 1 | NULL | NULL | 2016-09-01 8:42 | NULL | ... | NULL |
| 2 | 2016-09-01 10:01 | NULL | NULL | NULL | ... | NULL |
| 2 | NULL | 2016-09-01 10:01 | NULL | NULL | ... | NULL |
我不知道为什么要这样做。在旋转方面,我是一个菜鸟,但我看到的所有示例都显示了旋转命令的工作方式与我预期的一样。
这个查询中的 pivot 语句出了什么问题?
______________________________________________________________
感谢TT。将我链接到这个! - 这将生成一个示例 table 供您进行故障排除
CREATE TABLE mytable(
TimeStamp VARCHAR(23) NOT NULL PRIMARY KEY
,UserId INTEGER NOT NULL
,event INTEGER NOT NULL
,message VARCHAR(31) NOT NULL
,Id INTEGER NOT NULL
);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:40:11.343',187,0,'Created',5);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:40:30.297',187,1,'Started',5);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:40:30.560',187,2,'Completed',5);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:00.167',238,1,'Started',6);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:41:59.667',238,2,'Completed',6);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:41:55.670',238,0,'Created',6);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:09.297',238,0,'Created',7);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:11.403',238,2,'Completed',7);
INSERT INTO mytable(TimeStamp,UserId,event,message,Id) VALUES ('2016-09-01 04:42:11.843',238,1,'Started',7);
我认为您的实际 table 中有一些附加列,您希望在其上进行数据透视,如果是这样的话,请尝试这样做: 创建一个派生的 table (SourceTable),以过滤您想要的特定列。
declare @a table ([Timestamp] datetime, [Event] int, Id int, a int )
insert into @a values ( '2016-09-01 08:40' , 0 , 1 , 1 )
insert into @a values ( '2016-09-01 08:41', 1 , 1 , 2 )
insert into @a values ( '2016-09-01 08:42', 2 , 1 , 3 )
insert into @a values ( '2016-09-01 10:01', 0 , 2 , 4 )
insert into @a values ( '2016-09-01 10:01' , 1 , 2 , 5 )
select Id
,[0] as created
,[1] as started
,[2] as completed
from
(
select [Timestamp], [Event], Id from @a
) as SourceTable
pivot
(max(timestamp) for event in ([0],[1],[2])) as pivottable;
@a- 您的实际 table 和 SourceTable 派生的 table