枢轴如何用于 select 特定票证 ID 的前三个所有者
How pivot is used to select first three owners of a particular ticketid
ticketid owner owndate
1001 LEWIS 2004-06-18 14:15:11.000
1001 WILSON 2004-06-18 14:16:54.000
1001 WILSON 2004-06-18 14:21:12.000
1001 NULL 2004-09-01 09:56:11.000
1001 CALDONE 2005-02-02 08:38:28.000
1001 SINCLAIR 2005-02-02 08:54:02.000
1002 NULL 2005-02-02 08:40:06.000
1002 WILSON 2004-06-18 14:33:47.000
1002 NULL 2004-08-31 15:12:46.000
1002 NULL 2004-09-24 10:03:09.000
1003 RAMSDALE 2004-09-24 10:04:24.000
1003 MOTIKA 2004-08-31 14:51:45.000
1003 NULL 2004-08-31 15:05:50.000
1003 MURTHY 2004-09-02 14:50:28.000
1004 NULL 2004-08-31 15:28:37.000
1004 NULL 2004-09-24 09:24:21.000
1005 WILSON 2004-09-02 16:29:43.000
输出应该是
ticketid owner1 owner2 owner3
1001 NULL NULL NULL
1002 NULL NULL NULL
1003 NULL NULL NULL
1004 NULL NULL NULL
1005 NULL NULL NULL
1006 NULL NULL NULL
1007 NULL NULL NULL
1008 NULL NULL NULL
而不是 NULL。它应该显示自己日期的差异。即,特定所有者被分配了多长时间的票。我想显示一张特定票的前三位所有者。 请指导。
我计算的时差为:
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY owndate) AS rn
FROM tkownerhistory
)
SELECT mc.ticketid, mc.owner,mc.owndate
,left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 86400*30 AS VARCHAR),2) + ' months ' +
left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 86400 AS VARCHAR),2) + ' days ' +
left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 3600 AS VARCHAR),2) + ':' +
right('0' + CAST(((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 60) % 60 AS VARCHAR),2) + ':' +
right('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) % 60 AS VARCHAR),2)
as TimeDiffInHours
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn-1
order by mc.owndate
这显示输出
1001 LEWIS 2004-06-18 14:15:11.000 00 months 00 days 00:01:43
1001 WILSON 2004-06-18 14:16:54.000 00 months 00 days 00:04:18
1001 WILSON 2004-06-18 14:21:12.000 00 months 00 days 00:12:35
1002 WILSON 2004-06-18 14:33:47.000 02 months 07 days 01:13:32
1005 MOTIKA 2004-08-31 14:47:19.000 00 months 00 days 00:04:26
1003 MOTIKA 2004-08-31 14:51:45.000 00 months 00 days 00:14:05
1003 NULL 2004-08-31 15:05:50.000 00 months 00 days 00:06:56
1002 NULL 2004-08-31 15:12:46.000 00 months 00 days 00:15:51
但我不确定如何旋转它,并且只有特定票证 ID 的前三个所有者被选为列,数据将为 "timediffinhours"
假设
i) 您只需要为 3 个所有者进行数据透视。
ii) 我在第二个展示了datediff,你可以像上面那样轻松地将它们转换成disered格式。
也告诉我,问题出在哪里,
Declare @tkownerhistory table(ticketid int, [owner] varchar(50),owndate datetime)
insert into @tkownerhistory values(1001,'LEWIS','2004-06-18 14:15:11.000'),
(1001,'WILSON','2004-06-18 14:16:54.000'),
(1001,'WILSON','2004-06-18 14:21:12.000'),
(1001,NULL ,'2004-09-01 09:56:11.000'),
(1001,'CALDONE','2005-02-02 08:38:28.000'),
(1001,'SINCLAIR','2005-02-02 08:54:02.000'),
(1002,NULL ,'2005-02-02 08:40:06.000'),
(1002,'WILSON','2004-06-18 14:33:47.000'),
(1002, NULL,'2004-08-31 15:12:46.000'),
(1002, NULL,'2004-09-24 10:03:09.000'),
(1003,'RAMSDALE','2004-09-24 10:04:24.000'),
(1003,'MOTIKA','2004-08-31 14:51:45.000'),
(1003, NULL,'2004-08-31 15:05:50.000'),
(1003, 'URTHY','2004-09-02 14:50:28.000'),
(1004 , NULL , '2004-08-31 15:28:37.000'),
(1004 , NULL, '2004-09-24 09:24:21.000'),
(1005, 'WILSON','2004-09-02 16:29:43.000')
;With CTE as
(
SELECT *, ROW_NUMBER() OVER (partition by ticketid ORDER BY ticketid,owndate ) AS rn
--,datediff(day,owndate,lead(owndate,1)over(order by owndate))dtdiff
FROM @tkownerhistory
)
,CTE1 as
(
select *
from cte
where rn<=4
)
--select * from cte1
select a.ticketid
,datediff(second,a.owndate,b.owndate)[owner1]
,datediff(second,b.owndate,c.owndate)[owner2]
,datediff(second,c.owndate,d.owndate)[owner3]
from
cte1 A
outer apply(select * from cte1 where ticketid=a.ticketid and rn=2)b
outer apply(select * from cte1 where ticketid=a.ticketid and rn=3)c
outer apply(select * from cte1 where ticketid=a.ticketid and rn=4)d
where a.rn=1
ticketid owner owndate
1001 LEWIS 2004-06-18 14:15:11.000
1001 WILSON 2004-06-18 14:16:54.000
1001 WILSON 2004-06-18 14:21:12.000
1001 NULL 2004-09-01 09:56:11.000
1001 CALDONE 2005-02-02 08:38:28.000
1001 SINCLAIR 2005-02-02 08:54:02.000
1002 NULL 2005-02-02 08:40:06.000
1002 WILSON 2004-06-18 14:33:47.000
1002 NULL 2004-08-31 15:12:46.000
1002 NULL 2004-09-24 10:03:09.000
1003 RAMSDALE 2004-09-24 10:04:24.000
1003 MOTIKA 2004-08-31 14:51:45.000
1003 NULL 2004-08-31 15:05:50.000
1003 MURTHY 2004-09-02 14:50:28.000
1004 NULL 2004-08-31 15:28:37.000
1004 NULL 2004-09-24 09:24:21.000
1005 WILSON 2004-09-02 16:29:43.000
输出应该是
ticketid owner1 owner2 owner3
1001 NULL NULL NULL
1002 NULL NULL NULL
1003 NULL NULL NULL
1004 NULL NULL NULL
1005 NULL NULL NULL
1006 NULL NULL NULL
1007 NULL NULL NULL
1008 NULL NULL NULL
而不是 NULL。它应该显示自己日期的差异。即,特定所有者被分配了多长时间的票。我想显示一张特定票的前三位所有者。 请指导。 我计算的时差为:
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY owndate) AS rn
FROM tkownerhistory
)
SELECT mc.ticketid, mc.owner,mc.owndate
,left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 86400*30 AS VARCHAR),2) + ' months ' +
left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 86400 AS VARCHAR),2) + ' days ' +
left('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 3600 AS VARCHAR),2) + ':' +
right('0' + CAST(((dATEDIFF(SECOND, mc.owndate, mp.owndate)) / 60) % 60 AS VARCHAR),2) + ':' +
right('0' + CAST((dATEDIFF(SECOND, mc.owndate, mp.owndate)) % 60 AS VARCHAR),2)
as TimeDiffInHours
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn-1
order by mc.owndate
这显示输出
1001 LEWIS 2004-06-18 14:15:11.000 00 months 00 days 00:01:43
1001 WILSON 2004-06-18 14:16:54.000 00 months 00 days 00:04:18
1001 WILSON 2004-06-18 14:21:12.000 00 months 00 days 00:12:35
1002 WILSON 2004-06-18 14:33:47.000 02 months 07 days 01:13:32
1005 MOTIKA 2004-08-31 14:47:19.000 00 months 00 days 00:04:26
1003 MOTIKA 2004-08-31 14:51:45.000 00 months 00 days 00:14:05
1003 NULL 2004-08-31 15:05:50.000 00 months 00 days 00:06:56
1002 NULL 2004-08-31 15:12:46.000 00 months 00 days 00:15:51
但我不确定如何旋转它,并且只有特定票证 ID 的前三个所有者被选为列,数据将为 "timediffinhours"
假设 i) 您只需要为 3 个所有者进行数据透视。
ii) 我在第二个展示了datediff,你可以像上面那样轻松地将它们转换成disered格式。
也告诉我,问题出在哪里,
Declare @tkownerhistory table(ticketid int, [owner] varchar(50),owndate datetime)
insert into @tkownerhistory values(1001,'LEWIS','2004-06-18 14:15:11.000'),
(1001,'WILSON','2004-06-18 14:16:54.000'),
(1001,'WILSON','2004-06-18 14:21:12.000'),
(1001,NULL ,'2004-09-01 09:56:11.000'),
(1001,'CALDONE','2005-02-02 08:38:28.000'),
(1001,'SINCLAIR','2005-02-02 08:54:02.000'),
(1002,NULL ,'2005-02-02 08:40:06.000'),
(1002,'WILSON','2004-06-18 14:33:47.000'),
(1002, NULL,'2004-08-31 15:12:46.000'),
(1002, NULL,'2004-09-24 10:03:09.000'),
(1003,'RAMSDALE','2004-09-24 10:04:24.000'),
(1003,'MOTIKA','2004-08-31 14:51:45.000'),
(1003, NULL,'2004-08-31 15:05:50.000'),
(1003, 'URTHY','2004-09-02 14:50:28.000'),
(1004 , NULL , '2004-08-31 15:28:37.000'),
(1004 , NULL, '2004-09-24 09:24:21.000'),
(1005, 'WILSON','2004-09-02 16:29:43.000')
;With CTE as
(
SELECT *, ROW_NUMBER() OVER (partition by ticketid ORDER BY ticketid,owndate ) AS rn
--,datediff(day,owndate,lead(owndate,1)over(order by owndate))dtdiff
FROM @tkownerhistory
)
,CTE1 as
(
select *
from cte
where rn<=4
)
--select * from cte1
select a.ticketid
,datediff(second,a.owndate,b.owndate)[owner1]
,datediff(second,b.owndate,c.owndate)[owner2]
,datediff(second,c.owndate,d.owndate)[owner3]
from
cte1 A
outer apply(select * from cte1 where ticketid=a.ticketid and rn=2)b
outer apply(select * from cte1 where ticketid=a.ticketid and rn=3)c
outer apply(select * from cte1 where ticketid=a.ticketid and rn=4)d
where a.rn=1