【发布时间】:2014-08-06 09:38:16
【问题描述】:
我有一张这样的桌子:
+----------------------------------------------------+
| PI | VS | S | HID | DESC | MS | QT |
+----------------------------------------------------+
| 195 | 152 | 0 | 554 | Description 1 | 2013 | |
| 195 | 152 | 0 | 554 | Description 1 | JAN | 3677 |
| 195 | 152 | 0 | 554 | Description 1 | FEB | 4187 |
| 195 | 152 | 0 | 554 | Description 1 | MAR | 3344 |
| 195 | 152 | 0 | 554 | Description 1 | APR | 4001 |
| 195 | 152 | 0 | 554 | Description 1 | MAY | 4966 |
| 195 | 152 | 0 | 554 | Description 1 | JUN | 1079 |
| 195 | 152 | 0 | 554 | Description 1 | JUL | 452 |
| 195 | 152 | 0 | 554 | Description 1 | AUG | 2224 |
| 195 | 152 | 0 | 554 | Description 1 | SEP | 45478 |
| 195 | 152 | 0 | 554 | Description 1 | OCT | 2104 |
| 195 | 152 | 0 | 554 | Description 1 | NOV | 122 |
| 195 | 152 | 0 | 554 | Description 1 | DEC | 110 |
+----------------------------------------------------+
| 195 | 152 | 0 | 554 | Description 1 | 2013 | |
| 195 | 152 | 0 | 554 | Description 1 | JAN | 3377 |
| 195 | 152 | 0 | 554 | Description 1 | FEB | 4187 |
| 195 | 152 | 0 | 554 | Description 1 | MAR | 3344 |
| 195 | 152 | 0 | 554 | Description 1 | APR | 4001 |
| 195 | 152 | 0 | 554 | Description 1 | MAY | 4966 |
| 195 | 152 | 0 | 554 | Description 1 | JUN | 1076 |
| 195 | 152 | 0 | 554 | Description 1 | JUL | 452 |
| 195 | 152 | 0 | 554 | Description 1 | AUG | 2224 |
| 195 | 152 | 0 | 554 | Description 1 | SEP | 45478 |
| 195 | 152 | 0 | 554 | Description 1 | OCT | 21554 |
| 195 | 152 | 0 | 554 | Description 1 | NOV | 122 |
| 195 | 152 | 0 | 554 | Description 1 | DEC | 110 |
+----------------------------------------------------+
我想提取第一行,然后将接下来的 12 行连接为字段,使用它们的内容作为列名。
类似:
+--------------------------------------------------------------------------------------------------------------------------------+
| PI | VS | S | HID | DESC | YEAR | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
+--------------------------------------------------------------------------------------------------------------------------------+
| 195 | 152 | 0 | 554 | Description 1 | 2013 | 3677 | 4187 | 3344 | 4001 | 4966 | 1079 | 452 | 2224 | 45478 | 2104 | 122 | 110 |
+--------------------------------------------------------------------------------------------------------------------------------+
| 195 | 152 | 0 | 554 | Description 1 | 2013 | 3377 | 4187 | 3344 | 4001 | 4966 | 1076 | 452 | 2224 | 45478 | 21554 | 122 | 110 |
+--------------------------------------------------------------------------------------------------------------------------------+
这样的事情可能吗?
我读过数据透视表,这似乎与我想做的类似,但我没有找到任何类似的示例。
我该怎么做?
我尝试了什么:
WITH pivot_data AS (
SELECT PI, VS, S, HID, DESC, MS, QT VOLUME
FROM MONTHLY_RATES
)
SELECT *
FROM pivot_data
PIVOT (
sum(VOLUME)
FOR MS
IN (
'JAN',
'FEB',
'MAR',
'APR',
'MAY',
'JUN',
'JUL',
'AUG',
'SEP',
'OCT',
'NOV',
'DEC'
)
);
它有效但确实省略了年份(我需要保留),并且它总结每个月的值以防重复值,这不是我想要什么。
更新
MONTHLY_RATES表:
CREATE TABLE MONTHLY_RATES (
PI VARCHAR2(3 CHAR),
VS VARCHAR2(3 CHAR),
S VARCHAR2(2 CHAR),
HID VARCHAR2(3 CHAR),
"DESC" VARCHAR2(200 CHAR),
MS VARCHAR2(4 CHAR),
QT NUMBER(10,0)
);
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', '2013', null);
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'JAN', '3677');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'FEB', '4187');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'MAR', '3344');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'APR', '4001');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'MAY', '4966');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'JUN', '1079');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'JUL', '452');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'AUG', '2224');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'SEP', '45478');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'OCT', '2104');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'NOV', '122');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'DEC', '110');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', '2013', null);
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'JAN', '3377');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'FEB', '4187');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'MAR', '3344');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'APR', '4001');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'MAY', '4966');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'JUN', '1076');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'JUL', '452');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'AUG', '2224');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'SEP', '45478');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'OCT', '21554');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'NOV', '122');
INSERT INTO MONTHLY_RATES VALUES('195', '152', '0', '554', 'Description 1', 'DEC', '110');
【问题讨论】:
-
你真的有两个相同的结果集一个一个吗?您打算使用 2013 年和 2014 年而不是 2013 年和 2013 年吗?
-
@zaratustra 不幸的是我不知道。该表不是由我填写的,我只是想要一个更“可读”的表,我唯一知道的是我将有 13 行的“包”,第一行包含年份,其他 12 行包含月份。事实上是的,我可以在同一年有 30 次(所以 30*13 总记录,同一年)不同月份的值......
-
请给我们提供脚本或 CTE?
-
我们应该如何区分这两组记录?
-
但是如何确定相关的十三条记录呢?表中没有固有的顺序;即使您同时插入 13 个,也不能保证它们会被连续存储或检索。您必须拥有每个“集合”成员共有的东西,并且该“集合”是唯一的。
标签: sql oracle plsql pivot-table