Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL—将同一表的多行合并到自己的行中_Sql_Oracle_Oracle10g_Pivot - Fatal编程技术网

Oracle SQL—将同一表的多行合并到自己的行中

Oracle SQL—将同一表的多行合并到自己的行中,sql,oracle,oracle10g,pivot,Sql,Oracle,Oracle10g,Pivot,我有一个类似于SQL Fiddle上的表: 这张桌子有12行。6属于一个“集合”,其他6属于另一个“集合”。它们按标识符列分组。实际上,我要查询的表包含更多的行和列 我想做一个选择,每个标识符给我一行。 然后它应该显示insertTime,然后对于每个“步骤”显示“是”值,最后对于每个“步骤”值显示“否”值 我认为我需要与group by、distinct和Join的组合来实现这一点,但我不知道如何实现 下面是它的外观: +------------+------------------+----

我有一个类似于SQL Fiddle上的表:

这张桌子有12行。6属于一个“集合”,其他6属于另一个“集合”。它们按标识符列分组。实际上,我要查询的表包含更多的行和列

我想做一个选择,每个标识符给我一行。 然后它应该显示insertTime,然后对于每个“步骤”显示“是”值,最后对于每个“步骤”值显示“否”值

我认为我需要与group by、distinct和Join的组合来实现这一点,但我不知道如何实现

下面是它的外观:

+------------+------------------+----------+----------+----------+---------+---------+---------+
| 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;
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 |
查询1

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;
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 |

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;
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 |

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;
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 |
查询1

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;
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 |

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;
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 |

看看pivot谢谢!我使用的是Oracle 10g,因此无法使用PIVOT功能。无论如何,我现在将通过浏览谷歌搜索“Oracle 10g PIVOT”来尝试寻找替代方案。如果你没有
PIVOT
功能,那么你可以使用条件聚合(如@MT0下面的答案所示)。看看PIVOT谢谢!我使用的是Oracle 10g,因此无法使用PIVOT功能。无论如何,我现在将通过浏览谷歌搜索“Oracle 10g PIVOT”来尝试寻找替代方案。如果您没有
PIVOT
功能,那么您可以使用条件聚合(如下面@MT0的答案所示)。