Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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_Oracle11g_Union - Fatal编程技术网

导致重复行的联合-Oracle SQL

导致重复行的联合-Oracle SQL,sql,oracle,oracle11g,union,Sql,Oracle,Oracle11g,Union,我的数据集如下所示: | Order | Step | Step_Complete_Date | |:------:|:----:|:------------------:| | ABC454 | 1 | 12/21/2018 | | ABC454 | 2 | 12/22/2018 | | ABC454 | 3 | NULL | | ABC454 | 4 | 12/23/2018 | | ABC

我的数据集如下所示:

|  Order | Step | Step_Complete_Date |
|:------:|:----:|:------------------:|
| ABC454 |   1  |     12/21/2018     |
| ABC454 |   2  |     12/22/2018     |
| ABC454 |   3  |        NULL        |
| ABC454 |   4  |     12/23/2018     |
| ABC454 |   5  |     12/23/2018     |
| ABC433 |   1  |      1/1/2019      |
| ABC433 |   2  |      1/1/2019      |
| ABC433 |   3  |      1/2/2019      |
| ABC433 |   4  |      1/3/2019      |
| ABC433 |   5  |      1/7/2019      |
| ABC600 |   1  |      2/1/2019      |
| ABC600 |   2  |      2/7/2019      |
| ABC600 |   3  |      3/1/2019      |
| ABC600 |   4  |        NULL        |
| ABC600 |   5  |        NULL        |
| ABC800 |   1  |      5/1/2019      |
| ABC800 |   2  |      5/5/2019      |
| ABC800 |   3  |      5/5/2019      |
| ABC800 |   4  |      5/5/2019      |
| ABC800 |   5  |        NULL        |
| ABC999 |   1  |      7/1/2019      |
| ABC999 |   2  |      7/1/2019      |
| ABC999 |   3  |      7/1/2019      |
| ABC999 |   4  |      7/1/2019      |
| ABC999 |   5  |        NULL        |
我需要编写SQL查询来查找步骤4或步骤5已完成的任何订单,即步骤完成日期不为空

我尝试了以下方法:

WITH
  step4 AS
    (
       SELECT Order_No, Step_No, Step_Complete_Date AS Step_4_Complete_Date, NULL AS Step_5_Complete_Date
       FROM tblSteps
       WHERE Step_No = '4' AND Step_Complete_Date IS NOT NULL
     ),

   step5 AS
    (
       SELECT Order_No, Step_No, NULL AS Step_4_Complete_Date, Step_Complete_Date AS Step_5_Complete_Date
       FROM tblSteps
       WHERE Step_No = '5' AND Step_Complete_Date IS NOT NULL
     )

   SELECT * FROM Step4
   UNION
   SELECT * FROM Step5
SELECT Order_No, '4' AS Step_No, 
MAX(CASE WHEN Step_No = 4 THEN Step_Complete_Date END) AS Step_4_Complete_Date, 
MAX(CASE WHEN Step_No = 5 THEN Step_Complete_Date END) AS Step_4_Complete_Date
FROM tblSteps
WHERE Step_No IN ('4','5') AND Step_Complete_Date IS NOT NULL
GROUP BY Order_No
但结果是:

| ORDER_NO | STEP_NO | STEP_4_COMPLETE_DATE | STEP_5_COMPLETE_DATE |
|:--------:|:-------:|:--------------------:|:--------------------:|
|  ABC433  |    4    |       1/3/2019       |        (null)        |
|  ABC433  |    5    |        (null)        |       1/7/2019       |
|  ABC454  |    4    |      12/23/2018      |        (null)        |
|  ABC454  |    5    |        (null)        |      12/23/2018      |
|  ABC800  |    4    |       5/5/2019       |        (null)        |
|  ABC999  |    4    |       7/1/2019       |        (null)        |
理想情况下,它看起来像:

| ORDER_NO | STEP_4_COMPLETE_DATE | STEP_5_COMPLETE_DATE |
|:--------:|:--------------------:|:--------------------:|
|  ABC433  |       1/3/2019       |       1/7/2019       |
|  ABC454  |      12/23/2018      |      12/23/2018      |
|  ABC800  |       5/5/2019       |        (null)        |
|  ABC999  |       7/1/2019       |        (null)        |

如何更改SQL以创建所需的输出?我已经设置了一个。

我将在此处聚合,然后使用HAVING子句断言哪些订单匹配,哪些不匹配:

SELECT
    ORDER_NO,
    MAX(CASE WHEN Step = 4 THEN Step_Complete_Date END) AS STEP_4_COMPLETE_DATE,
    MAX(CASE WHEN Step = 5 THEN Step_Complete_Date END) AS STEP_5_COMPLETE_DATE
FROM tblSteps
GROUP BY
    ORDER_NO
HAVING
    COUNT(CASE WHEN Step IN (4, 5) AND Step_Complete_Date IS NOT NULL THEN 1 END) > 0;

您可以在下面尝试使用聚合和分组方式

WITH
  step4 AS
    (
       SELECT Order_No, Step_No, Step_Complete_Date AS Step_4_Complete_Date, NULL AS Step_5_Complete_Date
       FROM tblSteps
       WHERE Step_No = '4' AND Step_Complete_Date IS NOT NULL
     ),

   step5 AS
    (
       SELECT Order_No, Step_No, NULL AS Step_4_Complete_Date, Step_Complete_Date AS Step_5_Complete_Date
       FROM tblSteps
       WHERE Step_No = '5' AND Step_Complete_Date IS NOT NULL
     )

   SELECT SELECT Order_No, ,max(Step_4_Complete_Date),max(Step_5_Complete_Date) FROM Step4 group by Order_No, 
   UNION
   SELECT SELECT Order_No ,max(Step_4_Complete_Date),max(Step_5_Complete_Date) FROM Step5 group by Order_No
您可以按以下方式尝试分组:

WITH
  step4 AS
    (
       SELECT Order_No, Step_No, Step_Complete_Date AS Step_4_Complete_Date, NULL AS Step_5_Complete_Date
       FROM tblSteps
       WHERE Step_No = '4' AND Step_Complete_Date IS NOT NULL
     ),

   step5 AS
    (
       SELECT Order_No, Step_No, NULL AS Step_4_Complete_Date, Step_Complete_Date AS Step_5_Complete_Date
       FROM tblSteps
       WHERE Step_No = '5' AND Step_Complete_Date IS NOT NULL
     )

   SELECT * FROM Step4
   UNION
   SELECT * FROM Step5
SELECT Order_No, '4' AS Step_No, 
MAX(CASE WHEN Step_No = 4 THEN Step_Complete_Date END) AS Step_4_Complete_Date, 
MAX(CASE WHEN Step_No = 5 THEN Step_Complete_Date END) AS Step_4_Complete_Date
FROM tblSteps
WHERE Step_No IN ('4','5') AND Step_Complete_Date IS NOT NULL
GROUP BY Order_No

干杯

您可以使用pivot函数将步骤4完成日期和步骤5完成日期设置为列

select * from
(
select order_no , step_complete_date , step_no from tblSteps where step_no in (4,5)
)
pivot
(
  max(step_complete_date)
  for step_no in ( 4 as step_4_complete_dt , 5 as step_5_complete_dt)
)
where    nvl (step_4_complete_dt ,step_5_complete_dt ) is not null 
最后一个where子句用于消除4和5的完成日期都为空的行

注意,这里不会出现step_no列,如果step no列在一行中显示两个步骤的完成日期,我不清楚为什么需要step no列


希望这能解决您的问题

条件聚合的一个版本

SELECT
    ORDER_NO,
    MAX(CASE WHEN Step = 4 THEN Step_Complete_Date END) AS STEP_4_COMPLETE_DATE,
    MAX(CASE WHEN Step = 5 THEN Step_Complete_Date END) AS STEP_5_COMPLETE_DATE
FROM tblSteps
WHERE Step IN (4, 5)
GROUP BY ORDER_NO
HAVING COUNT(Step_Complete_Date) > 0;