【问题标题】:How to combine three queries?如何组合三个查询?
【发布时间】:2018-10-16 18:32:25
【问题描述】:

我有三个查询,我必须将它们组合在一起。

查询 1

WITH ph 
  AS (SELECT chrd, chwo, chse, chst, chvr, chfv, chrd, 
             ROW_NUMBER () OVER(PARTITION BY chwo ORDER BY chse, chvr desc) TEMP 
      FROM   wrpd.wscl 
      WHERE  chaj > '20180901' 
        AND  chst = 'R' 
        AND  chstb IN ( 'L1', 'R2' ) 
      ORDER  BY chse) 
SELECT * 
FROM   ph A 
WHERE  A.temp = 1 

查询 2

SELECT chrd, chwo, chse, chst, chvr, chfv, chrd, 
       ROW_NUMBER () OVER( PARTITION BY chwo  ORDER BY chse, chvr desc) TEMP 
FROM   wrpd.wscl 
WHERE  chajdt > '20180901' 
  AND  chst IN ( 'P', 'A' ) 
  AND  chstb IN ( 'L1', 'R2' ) 
ORDER  BY chst desc, chse 

查询 3

SELECT partd1, actdd1, dmre, dmde, dlro, dord, wvin, rcdt, 
       CHAR(DATE(Substr(CHAR(rcdt), 1, 4) 
                 || '-' 
                 || Substr(CHAR(rcdt), 5, 2) 
                 || '-' 
                 || Substr(CHAR(rcdt), 7, 2)), usa) AS "Conversion", 
       SUM(qty)  AS Shipments, 
       rcdt-dord AS Ship_Days 
FROM   pspd.zpslsp, 
       pspd.zpslma, 
       dlpd.drdm, 
       wrpd.wscl 
WHERE  partd1 = partpm 
  AND  delr = dmde 
  AND  actdd1 BETWEEN '201801' AND '201810' 
  AND  otypd1 NOT IN ( 'T', 'Z', 'W' ) 
  AND  dmty = 'RD' 
  AND  partpm LIKE '21101%' 
  AND  Substr(delr, 3, 3) NOT BETWEEN '390' AND '399' 
  AND  qtys > 0 
  AND  chfv = wvin 
GROUP  BY partd1, actdd1, dmde, dlro, dord, rcdt, dmre, wvin 
ORDER  BY 1, 2 

最终结果中的所需列:

DMRE, CHRD, DMDE, CHWO, CHSE, CHST, CHVR, CHFV, WVIN, PARTd1, ACTDd1, 
CHRD, DLRO, DORD, RCDT,
CHAR(DATE(Substr(CHAR(rcdt), 1, 4) 
                 || '-' 
                 || Substr(CHAR(rcdt), 5, 2) 
                 || '-' 
                 || Substr(CHAR(rcdt), 7, 2)), usa) 
AS "Conversion",
SUM(QTYS) AS Shipments, RCDT-DORD AS Ship_Days
ROW_NUMBER () OVER(PARTITION BY CHWO ORDER BY CHSE,CHVR DESC) TEMP

注意:我不能将查询 1 和查询 2 合并为一个,因为输出不同。

新编辑:我在查询 2 中添加了“ROW_NUMBER () OVER(PARTITION BY CHWO ORDER BY CHSE,CHVR DESC) TEMP”,这可能有助于使用联合。

提前致谢!

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 请分享架构或至少在一段时间内限定列,以便我们查看来源。
  • 嗨。假设我说,我这里有三个整数,我想要一个整数结果,如何组合它们呢?请阅读minimal reproducible example并采取行动。
  • @philipxy 我得到了想要的答案,这个帖子中的答案。我想要的结果很清楚。你能清楚地解释我应该完成/修复什么吗??
  • 你没有说想要的结果应该是什么。你只需给出它的列。 “结合”没有任何意义——见我的第一条评论。接受的答案是“我猜”和“类似这样的”。结果中出现了哪些行? “完成/修复”是说,用省略号完成/修复句子,表示结果中有哪些行。

标签: sql join db2 union union-all


【解决方案1】:

我相信你可以自己解决这个问题..我想它需要看起来像这样..但你没有说你想要如何组合数据所以我只是一个交叉产品 (最后一个数据集的WHERE 1=1) 为前两个的并集

with PH AS(
    SELECT CHRD,CHWO,CHSE,CHST,CHVR,CHFV,CHRD,
    ROW_NUMBER () OVER(PARTITION BY CHWO ORDER BY CHSE,CHVR  DESC) TEMP
    FROM WRPD.WSCL
    WHERE CHAJ > '20180901' 
    AND CHST ='R' 
    AND CHSTB in ('L1', 'R2')
    --ORDER BY CHSE 
), DT AS(
    SELECT CHRD,CHWO,CHSE,CHST,CHVR,CHFV,CHRD,
    ROW_NUMBER () OVER(PARTITION BY CHWO ORDER BY CHSE,CHVR  DESC) TEMP
    FROM WRPDAT.WSCLHP
    WHERE CHAJDT > '20180901' 
    AND CHST IN ('P','A') 
    AND CHSTB in ('L1', 'R2')
)
, U AS (
    SELECT * 
    FROM PH A
    WHERE A.TEMP=1
    UNION ALL
    SELECT *
    FROM DT
)
, Z AS
(
    SELECT
    PARTd1, ACTDd1, DMRE,DMDE,DLRO,DORD,WVIN,RCDT,
    CHAR(DATE(SUBSTR(CHAR(RCDT),1,4) ||'-'||
        SUBSTR(CHAR(RCDT),5,2) ||'-'||
       SUBSTR(CHAR(RCDT),7,2)), USA)
    AS "Conversion",
    SUM(QTY) AS Shipments, RCDT-DORD AS Ship_Days
    FROM PSPD.ZPSLSP, PSPD.ZPSLMA, dlpd.drdm,WRPD.WSCL
    WHERE PARTd1 = PARTpm
    AND DELR = DMDE
    AND   ACTDd1 between '201801' and '201810'
    AND OTYPd1 NOT IN ('T','Z','W')

    AND DMTY = 'RD'
    and partpm like '21101%' 
    and substr(delr,3,3) not between '390' and '399'

    and QTYS >0
    and  CHFV = WVIN

    Group By PARTd1, ACTDd1, DMDE, DLRO, DORD,RCDT, DMRE,WVIN
)
SELECT U.*, Z.* FROM U, Z WHERE CHFV = WVIN
ORDER BY TEMP, PARTd1, ACTDd1

【讨论】:

  • 嘿,我不明白您的意思:“您希望如何组合数据”。 ??我想要的结果中的所有列都用于相同的记录。 CHFV = WVIN ,此条件等同于查询 1,2 和 3 表中的值。
  • 我还对查询 2 的表名进行了更正。很抱歉这么晚了
  • 好的,所以我将WHERE 1=1 更改为WHERE CHFV = WVIN,如果这是您想要加入结果集的方式。一般来说,你问的并不难。如果您需要有人给您准确的代码,您需要提供 DDL 和数据的示例 INSERT 语句。否则,请尝试创建一个玩具/简化示例,将您正在努力学习的 SQL 知识归零
  • 非常感谢。当我添加 WHERE CHFV = WVIN 时,我得到了结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多