Oracle SQL - 将相同 table 的多行组合成自己的行
Oracle SQL - Combining multiple rows of same table into own row
我有一个 table 在 SQL Fiddle 上看起来像这个:http://sqlfiddle.com/#!4/0fabe0/2/0
table 包含 12 行。 6个属于一个"set",另外6个属于另一个"set"。它们按标识符列分组。实际上,我要查询的 table 包含更多行和列。
我想制作一个 select,每个标识符给我一行。
然后它应该显示 insertTime,然后为每个 "step" 显示 "Yes" 值,最后为每个 "step" 值显示 "No" 值。
我想我需要结合使用 group by、distinct 和 joins 来实现这一点,但我不知道该怎么做。
它应该是这样的:
+------------+------------------+----------+----------+----------+---------+---------+---------+
| identifier | insertTime | yesStep3 | yesStep2 | yesStep1 | noStep1 | noStep2 | noStep3 |
+------------+------------------+----------+----------+----------+---------+---------+---------+
| 123 | 08.04.2018 13:37 | 13.3 | 12.2 | 11.1 | 13 | 13.3 | 14.1 |
| 124 | 08.04.2018 13:40 | 14.14 | 13.13. | 12.12. | 10.1 | 11.11 | 9.9 |
+------------+------------------+----------+----------+----------+---------+---------+---------+
Oracle 11g R2 架构设置:
CREATE TABLE testTable(
identifier NUMBER(3,0),
insertTime timestamp,
yesNo NUMBER(1,0),
stepNumber NUMBER(1,0),
value NUMBER(5,2)
);
INSERT INTO testTable (identifier, insertTime, yesNo, stepNumber, value)
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 0, 1, 13.0 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 0, 2, 13.3 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 0, 3, 14.1 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 1, 1, 11.1 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 1, 2, 12.2 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 1, 3, 13.3 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 0, 1, 9.9 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 0, 2, 10.10 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 0, 3, 11.11 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 1, 1, 12.12 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 1, 2, 13.13 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 1, 3, 14.14 FROM DUAL;
查询 1:
SELECT identifier,
insertTime,
MAX( CASE WHEN yesNo = 1 AND stepNumber = 1 THEN value END ) AS yesStep1,
MAX( CASE WHEN yesNo = 1 AND stepNumber = 2 THEN value END ) AS yesStep2,
MAX( CASE WHEN yesNo = 1 AND stepNumber = 3 THEN value END ) AS yesStep3,
MAX( CASE WHEN yesNo = 0 AND stepNumber = 1 THEN value END ) AS noStep1,
MAX( CASE WHEN yesNo = 0 AND stepNumber = 2 THEN value END ) AS noStep2,
MAX( CASE WHEN yesNo = 0 AND stepNumber = 3 THEN value END ) AS noStep3
FROM testTable
GROUP BY identifier, insertTime
| IDENTIFIER | INSERTTIME | YESSTEP1 | YESSTEP2 | YESSTEP3 | NOSTEP1 | NOSTEP2 | NOSTEP3 |
|------------|-----------------------|----------|----------|----------|---------|---------|---------|
| 123 | 2018-04-08 13:37:00.0 | 11.1 | 12.2 | 13.3 | 13 | 13.3 | 14.1 |
| 124 | 2018-04-08 13:40:00.0 | 12.12 | 13.13 | 14.14 | 9.9 | 10.1 | 11.11 |
我有一个 table 在 SQL Fiddle 上看起来像这个:http://sqlfiddle.com/#!4/0fabe0/2/0
table 包含 12 行。 6个属于一个"set",另外6个属于另一个"set"。它们按标识符列分组。实际上,我要查询的 table 包含更多行和列。
我想制作一个 select,每个标识符给我一行。 然后它应该显示 insertTime,然后为每个 "step" 显示 "Yes" 值,最后为每个 "step" 值显示 "No" 值。
我想我需要结合使用 group by、distinct 和 joins 来实现这一点,但我不知道该怎么做。
它应该是这样的:
+------------+------------------+----------+----------+----------+---------+---------+---------+
| identifier | insertTime | yesStep3 | yesStep2 | yesStep1 | noStep1 | noStep2 | noStep3 |
+------------+------------------+----------+----------+----------+---------+---------+---------+
| 123 | 08.04.2018 13:37 | 13.3 | 12.2 | 11.1 | 13 | 13.3 | 14.1 |
| 124 | 08.04.2018 13:40 | 14.14 | 13.13. | 12.12. | 10.1 | 11.11 | 9.9 |
+------------+------------------+----------+----------+----------+---------+---------+---------+
Oracle 11g R2 架构设置:
CREATE TABLE testTable(
identifier NUMBER(3,0),
insertTime timestamp,
yesNo NUMBER(1,0),
stepNumber NUMBER(1,0),
value NUMBER(5,2)
);
INSERT INTO testTable (identifier, insertTime, yesNo, stepNumber, value)
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 0, 1, 13.0 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 0, 2, 13.3 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 0, 3, 14.1 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 1, 1, 11.1 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 1, 2, 12.2 FROM DUAL UNION ALL
SELECT 123, TIMESTAMP '2018-04-08 13:37:00', 1, 3, 13.3 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 0, 1, 9.9 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 0, 2, 10.10 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 0, 3, 11.11 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 1, 1, 12.12 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 1, 2, 13.13 FROM DUAL UNION ALL
SELECT 124, TIMESTAMP '2018-04-08 13:40:00', 1, 3, 14.14 FROM DUAL;
查询 1:
SELECT identifier,
insertTime,
MAX( CASE WHEN yesNo = 1 AND stepNumber = 1 THEN value END ) AS yesStep1,
MAX( CASE WHEN yesNo = 1 AND stepNumber = 2 THEN value END ) AS yesStep2,
MAX( CASE WHEN yesNo = 1 AND stepNumber = 3 THEN value END ) AS yesStep3,
MAX( CASE WHEN yesNo = 0 AND stepNumber = 1 THEN value END ) AS noStep1,
MAX( CASE WHEN yesNo = 0 AND stepNumber = 2 THEN value END ) AS noStep2,
MAX( CASE WHEN yesNo = 0 AND stepNumber = 3 THEN value END ) AS noStep3
FROM testTable
GROUP BY identifier, insertTime
| IDENTIFIER | INSERTTIME | YESSTEP1 | YESSTEP2 | YESSTEP3 | NOSTEP1 | NOSTEP2 | NOSTEP3 |
|------------|-----------------------|----------|----------|----------|---------|---------|---------|
| 123 | 2018-04-08 13:37:00.0 | 11.1 | 12.2 | 13.3 | 13 | 13.3 | 14.1 |
| 124 | 2018-04-08 13:40:00.0 | 12.12 | 13.13 | 14.14 | 9.9 | 10.1 | 11.11 |