导致重复行的联合-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;