在枢轴中选择语句

时间:2017-03-01 02:17:01

标签: sql sql-server sql-server-2012

我想获得一个具有不同状态的数据透视表,并使用SQL查询从没有准备好的数据透视表的表中计算天数。 我尝试使用UNION ALL来插入列,但是查询太长而且不实用且效率不高。

我的表

数据表

Status  |date
-------------
New     |25/2/2017
Confirm |29/1/2017

状态表

Status
-------
New
Confirm
Finish

我想要的结果:

Status | 0-7|8-14|15-21|<30     ---->Days
------------------------------
New    | 1  | 0  | 0   | 1
Confirm| 0  | 0  | 0   | 1
Finish | 0  | 0  | 0   | 0

解决

解决方案

使用左连接状态表和数据表,然后使用case语句和pivot来解决它。感谢所有试图帮助我的人^^

1 个答案:

答案 0 :(得分:0)

使用下面符合您要求的代码。 我使用了日期格式:DDMMYYYY

--Create Table
CREATE TABLE A (Status Varchar(20),DT Date)
--Insert data
INSERT INTO A (Status,DT) VALUES ('New','2/25/2017')
INSERT INTO A (Status,DT) VALUES ('Confirm','01/29/2017')
INSERT INTO A (Status,DT) VALUES ('Finish','01/2/2017')

-- Query to get output
Select Status
       ,(Select CASE WHEN DATEPART(Day,b.DT) <=7  THEN 1 ELSE 0 END from A b WHERE b.Status = a.Status) as '0-7'
       ,(Select CASE WHEN DATEPART(Day,b.DT) <=14 and DATEPART(Day,b.DT)>7 THEN 1 ELSE 0 END from A b WHERE b.Status = a.Status) as '8-14'
      ,(Select CASE WHEN DATEPART(Day,b.DT) <=21 and DATEPART(Day,b.DT)>14 THEN 1 ELSE 0 END from A b WHERE b.Status = a.Status) as '15-21'
      ,(Select CASE WHEN DATEPART(Day,b.DT) <=30 and DATEPART(Day,b.DT)>21 THEN 1 ELSE 0 END from A b WHERE b.Status = a.Status) as '<30'
from A a