【问题标题】:Convert SQL query to Pivot using dates (Oracle) [duplicate]使用日期(Oracle)将 SQL 查询转换为 Pivot [重复]
【发布时间】:2021-11-25 02:51:23
【问题描述】:

每个人。

我正在尝试将此 Oracle SQL 查询转换为 Pivot,但我无法弄清楚如何。

SELECT TO_CHAR (STARTTIME, 'YYYY/MM/DD')                AS DATETIME,
         COUNT (*)                                      AS QTY,
         DECODE (STATE,'P','PASS','F','FAIL',  STATE)   AS STATUS
    FROM R_TEST_RECORD
   WHERE SN IN (SELECT SN
                  FROM R_SN
                 WHERE SKUNO = '750-062572')
     AND MESSTATION = 'SI_V1'
     AND STARTTIME BETWEEN TO_DATE ('2020/06/02 01:00:49',
                                    'YYYY/MM/DD HH24:MI:SS')
                       AND TO_DATE ('2021/10/02 01:53:49',
                                    'YYYY/MM/DD  HH24:MI:SS')
GROUP BY TO_CHAR (STARTTIME, 'YYYY/MM/DD'), STATE
ORDER BY DATETIME;

查询给了我下一张表:

DATETIME QTY STATUS
2021/03/16 106 PASS
2021/03/17 731 PASS
2021/03/19 102 PASS
2021/04/05 102 PASS
2021/06/08 100 PASS
2021/06/15 99 PASS
2021/06/20 712 PASS
2021/06/22 149 PASS
2021/06/29 33 PASS
2021/06/30 6 PASS
2021/07/02 2 PASS
2021/07/04 2 PASS

我想要的是这样的:

STATUS 2021/03/16 2021/03/17 2021/03/19 2021/04/05
PASS 106 731 102 102

我还希望它是动态的,因此我不必在 Pivot 语句中硬编码日期。

接下来是我的工作:

SELECT *
FROM (
    SELECT TO_CHAR (starttime, 'YYYY/MM/DD') starttime,
    STATE
    FROM r_test_record A
   WHERE     sn IN (SELECT sn
                      FROM r_sn
                     WHERE skuno = '750-062572')
         AND messtation = 'SI_V1'
         AND starttime BETWEEN TO_DATE ('2021/06/02 01:00:49',
                                        'YYYY/MM/DD HH24:MI:SS')
                           AND TO_DATE ('2021/10/02 01:53:49',
                                        'YYYY/MM/DD  HH24:MI:SS')
) 
PIVOT
(   
    COUNT(STATE)
    FOR STARTTIME IN (  
      SELECT DISTINCT TO_CHAR (starttime, 'YYYY/MM/DD') STARTTIME
   FROM r_test_record
  WHERE     sn IN (SELECT sn
                     FROM r_sn
                    WHERE skuno = '750-062572')
        AND messtation = 'SI_V1'
        AND starttime BETWEEN TO_DATE ('2021/06/02 01:00:49',
                                       'YYYY/MM/DD HH24:MI:SS')
                          AND TO_DATE ('2021/10/02 01:53:49',
                                       'YYYY/MM/DD  HH24:MI:SS')
    )
)

感谢您的帮助。

【问题讨论】:

  • 如果数据有 100 个不同的日期怎么办?你想要一个有 100 列的结果吗?谁能看懂这样的报告? (这并不是告诉你如何解决问题——它只是告诉你几乎可以肯定问题本身没有意义。)
  • 你完全正确,但我会按周分隔日期,所以它只会显示 7 天。非常感谢您的评论。
  • 如果永远是7天(一周),那就合理多了。唯一的问题是将日期显示为列名;这只能通过动态 SQL 完成,最好由您的报告软件处理(假设您使用一个)。这对你有用吗?

标签: sql oracle pivot


【解决方案1】:

如果要将其限制为七列,一个选项是按 WEEK_OF 隐式分组,这样您就可以保留多行。像这样的:

SELECT *
FROM (SELECT TRUNC(r.starttime, 'DAY') AS WEEK_OF, 
             TO_CHAR(r.starttime, 'D') AS DAY_OF_WEEK, 
             status
      FROM r_test_record r)
PIVOT (COUNT(*) FOR DAY_OF_WEEK IN (1 AS SUNDAY, 2 AS MONDAY, 3 AS TUESDAY,
                                               4 AS WEDNESDAY, 5 AS THURSDAY,
                                               6 AS FRIDAY, 7 AS SATURDAY))
ORDER BY WEEK_OF, STATUS;

您会丢失列名中的实际日期,但您可以运行它以获得完整的报告。或者你可以添加一个 where 子句来限制日期。

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2012-12-06
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多