【问题标题】:How can I get the sum of distinct items in a subquery?如何获得子查询中不同项目的总和?
【发布时间】:2019-12-11 22:03:24
【问题描述】:

这是我目前的查询。

SELECT DISTINCT(ITEM_NAME),
  DESCRIPTION,
  SUM(wm_inventory.ON_HAND_QTY) "INV",
  (SELECT DISTINCT(ITEM_NAME),
    SUM(wm_inventory.ON_HAND_QTY)
    FROM LOCN_HDR lh
    INNER JOIN wm_inventory
    ON lh.LOCN_ID = wm_inventory.LOCATION_ID
    INNER JOIN item_cbo
    ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
    where zone = 'BK5') as "QTY"
FROM LOCN_HDR lh
INNER JOIN wm_inventory
ON lh.LOCN_ID = wm_inventory.LOCATION_ID
INNER JOIN item_cbo
ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
WHERE ZONE IN ('BK1','BK2','BK3','BK4')
and ITEM_NAME in (SELECT DISTINCT(item_cbo.ITEM_NAME)
    FROM LOCN_HDR lh
    INNER JOIN wm_inventory
    ON lh.LOCN_ID = wm_inventory.LOCATION_ID
    INNER JOIN item_cbo
    ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
    where zone = 'BK5')
GROUP BY ITEM_NAME,
DESCRIPTION
ORDER BY ITEM_NAME

在此之后,我收到错误“ORA-00913:值太多”,因为 select 语句中的子查询正在拉两列。有解决办法吗?

基本上我需要提取两组不同位置的库存并并排比较。

我需要另一列包含“BK5”位置的库存。 “数量”列当前包含 BK1-4 位置的总和。

【问题讨论】:

  • 提供一些样本数据集和预期输出。
  • 添加的图片是查询成功的图片,子查询中没有(SELECT DISTINCT(ITEM_NAME))
  • 你知道DISTINCT 适用于一行,而不是一列?您对DISTINCT(x) 的使用可能没有达到您的预期。
  • 它正在做我在这种情况下需要它做的事情。它正确评估库存
  • 如果您这么说,但您不需要在选择中使用 DISTINCT - GROUP BY 会为您处理。无论如何,我认为您的要求只是进行相关的子查询。所以你需要一个别名。我会写一个答案!

标签: sql oracle


【解决方案1】:

您可以将子查询移动到 CTE 表达式 With temp_table_name as (subquery..) 或使用窗口函数 sum(column1)over( partition by column2 order by xxxx)

我想第一种方法可能类似于以下内容,(我目前无法访问 SQL 编辑器,因此您可能需要注意语法或琐碎错误)

    With qty_src as (
    SELECT ITEM_NAME ,
    SUM(wm_inventory.ON_HAND_QTY)  as qty
    FROM LOCN_HDR lh
    INNER JOIN wm_inventory
    ON lh.LOCN_ID = wm_inventory.LOCATION_ID
    INNER JOIN item_cbo
    ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
    where zone = 'BK5'
)
SELECT DISTINCT(ITEM_NAME),
  DESCRIPTION,
  SUM(wm_inventory.ON_HAND_QTY) "INV",
  qty_src.qty as "QTY"
FROM LOCN_HDR lh
INNER JOIN wm_inventory
ON lh.LOCN_ID = wm_inventory.LOCATION_ID
INNER JOIN item_cbo
ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
LEFT JOIN qty_src
    on qty_src.ITEM_NAME = lh.ITEM_NAME
WHERE ZONE IN ('BK1','BK2','BK3','BK4')
and ITEM_NAME in (SELECT DISTINCT(item_cbo.ITEM_NAME)
    FROM LOCN_HDR lh
    INNER JOIN wm_inventory
    ON lh.LOCN_ID = wm_inventory.LOCATION_ID
    INNER JOIN item_cbo
    ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
    where zone = 'BK5')
GROUP BY ITEM_NAME,
DESCRIPTION
ORDER BY ITEM_NAME

With 语句在上面声明了某种形式的临时表(公用表表达式),我们将其命名为 qty_src,然后将其左连接到主查询中以获取总和值。

我从子查询中删除了 distinct 语句,因为聚合函数 sum()....group by 会明确过滤字段。

【讨论】:

    【解决方案2】:
        SELECT ITEM_NAME,
          DESCRIPTION,
          SUM(wm_inventory.ON_HAND_QTY) "INV",
          (SELECT 
            SUM(wm_inventory.ON_HAND_QTY)
            FROM LOCN_HDR lh
            INNER JOIN wm_inventory
            ON lh.LOCN_ID = wm_inventory.LOCATION_ID
            INNER JOIN item_cbo_sub_query
            ON wm_inventory.ITEM_ID = item_cbo_sub_query.ITEM_ID
            where zone = 'BK5'
            AND item_cbo_sub_query.ITEM_ID=item_cbo.ITEM_ID
    ) as "QTY BK5"
        FROM LOCN_HDR lh
        INNER JOIN wm_inventory
        ON lh.LOCN_ID = wm_inventory.LOCATION_ID
        INNER JOIN item_cbo
        ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
        WHERE ZONE IN ('BK1','BK2','BK3','BK4')
        and ITEM_NAME in (SELECT item_cbo.ITEM_NAME
            FROM LOCN_HDR lh
            INNER JOIN wm_inventory
            ON lh.LOCN_ID = wm_inventory.LOCATION_ID
            INNER JOIN item_cbo
            ON wm_inventory.ITEM_ID = item_cbo.ITEM_ID
            where zone = 'BK5')
        GROUP BY ITEM_NAME,
        DESCRIPTION
        ORDER BY ITEM_NAME
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-21
      • 2014-07-28
      • 1970-01-01
      • 2021-11-12
      • 2021-08-30
      • 2015-07-21
      • 2010-10-12
      • 2021-07-22
      相关资源
      最近更新 更多