【发布时间】: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 完成,最好由您的报告软件处理(假设您使用一个)。这对你有用吗?