【问题标题】:How to aggregate or display only first row after adding column to group by statement将列添加到按语句分组后如何仅聚合或显示第一行
【发布时间】:2021-01-10 20:00:23
【问题描述】:

我需要收到有关在途产品总量的信息,并根据交货日期分为三列。为了做到这一点,我必须加入下面称为 vll 和 vl 的表。

为了区分日期,我构建了一个案例声明,但是一旦我在声明中使用 vl.arrivdate,我还需要将其添加到 Group By 中。然后我收到三个而不是每个产品一行。

您能否建议如何在不构建另一个大子查询的情况下在一行中达到相同的结果?

这是查询的这一部分的样子

SELECT
SUM(DISTINCT(NVL(vll.qty,0))) as "Transit Total",

CASE
  WHEN vl.arrivdate > camp_demand.start_date + 7 THEN NULL
    ELSE SUM(DISTINCT(NVL(vll.qty,0))) END as "Transit WK1",
    
CASE
  WHEN TO_DATE(vl.arrivdate) BETWEEN camp_demand.start_date + 7 AND camp_demand.start_date + 14 THEN SUM(DISTINCT(NVL(vll.qty,0)))
    ELSE NULL END as "Transit WK2",
      
CASE
  WHEN TO_DATE(vl.arrivdate) > camp_demand.start_date + 14 THEN SUM(DISTINCT(NVL(vll.qty,0)))
    ELSE NULL END as "Transit WK3"
GROUP BY
camp_demand.start_date,
vll.qty,
vl.arrivdate

下面是我现在得到的结果:

【问题讨论】:

    标签: sql oracle group-by aggregate


    【解决方案1】:

    您希望在聚合函数中包含条件(在您的情况下为SUM)。这称为条件聚合。对于每个产品的一个结果行,查询将如下所示:

    SELECT
      product_no as "Product",
      SUM(vll.qty) as "Transit Total",
      SUM(CASE WHEN vl.arrivdate <  cd.start_date +  7 THEN vll.qty END) as "Transit WK1",
      SUM(CASE WHEN vl.arrivdate >= cd.start_date +  7 
                AND vl.arrivdate <  cd.start_date + 14 THEN vll.qty END) as "Transit WK2",
      SUM(CASE WHEN vl.arrivdate >= cd.start_date + 14 THEN vll.qty END) as "Transit WK3"
    FROM ...
    GROUP BY product_no
    ORDER BY product_no;
    

    您的SUM(DISTINCT ...) 看起来很危险。我想您加入的太早或标准不完整,从而创建了一个太大的中间结果,其中包含重复项,然后您尝试摆脱。也许您想向我们展示整个查询并告诉我们这些表代表什么以及它们之间的关系。

    【讨论】:

    • 非常感谢,现在可以正常工作了。至于 SUM(DISTINCT) 你能澄清为什么它很危险以及它会导致什么问题(查询时间是否更长)?正如您指出的那样,我在其他地方也使用了类似的解决方案,我也在那里得到了重复。为简单起见,我将显示在不同的列/表上
    • 获取总和:SUM(DISTINCT(NVL(inventory.qty,0))) as "Inventory", 并加入该列:LEFT JOIN supply.inventory_v@jdasnap_supply inventory ON camp_demand.default_variant = inventory.item AND camp_demand.loc = inventory.loc AND camp_demand.day = inventory.day AND inventory.project in ('S','O')
    • 至于危险:您似乎有值,例如 100、100 和 200,并且您得到了多倍的值,例如三次:100、100、100、100、100、100、200、200 和 200。为了不得到 1200 的总和(只有 sum(value)),你使用 sum(distinct value) 得到 300。但是你想要 400(因为 100 + 100 + 200 = 400)。也许这个问题和答案可以帮助您理解这些问题并就如何解决问题提供建议:stackoverflow.com/questions/45080044/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多