【问题标题】:Select statement in pivot枢轴中的选择语句
【发布时间】:2017-07-20 04:58:35
【问题描述】:

我想获得一个具有不同状态的数据透视表,并使用 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来解决它。感谢所有试图帮助我的人^^

【问题讨论】:

  • 您可以使用“案例陈述”。参考这个stackoverflow.com/a/13526616/2960555
  • 我尝试使用 pivot 和 case 进行组合,但结果只是显示 New 和 Confirm。我不确定是什么问题......
  • 我找到了问题所在。问题是表中没有状态为 Finish 的数据。但是,我需要它在 sql server 2012 中显示。有人对此有任何解决方案吗?

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


【解决方案1】:

使用下面的代码来满足您的要求。 我使用了日期格式: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

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 2010-09-14
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多