【问题标题】:SQL query using case and Group by aggregation使用案例和按聚合分组的 SQL 查询
【发布时间】:2015-08-07 21:09:17
【问题描述】:

我有以下情况:

我拥有的仓库的 1 个表:ProductID、数量和地址 我拥有的商店的 1 表:ProductID 和数量 Stores 存储地址的 1 个表

我需要知道的是产品是“有货”还是“缺货”,使用的标准是产品必须有数量 >=0 或 >20k 才能被视为“缺货”两个表(商店和仓库)

我尝试过的如下:

SELECT Product_Cod, qty_wh, QtyStore,
    CASE
        WHEN sum(QtyStore) BETWEEN 1 AND 20000 THEN 
                                CASE
                                        WHEN qty_wh > 0 THEN 'In Stock'
                                        WHEN qty_wh = 0 THEN 'In Stock'
                                END
        WHEN sum(QtyStore) = 0 OR sum(QtyStore) > 20000 THEN
                                CASE
                                        WHEN qty_wh <= 0 THEN 'Out of Stock'
                                        WHEN qty_wh > 0 THEN 'in Stock'
                                END
    END AS [Result]
FROM tb_Products, tb_qtyStock, tb_StoreProdAddress
WHERE Product_Cod = wh_CodProduct
AND Product_Cod = Store_CodProduct
GROUP BY Product_Cod, qty_wh, QtyStore 
ORDER BY Product_Cod

哪些输出:

   ProdCod qty_wh QtyStore   Result
    10026   26      0       In Stock
    10026   26      1       In Stock
    10026   26      2       In Stock
    10070   25      0       In Stock
    10070   25      2       In Stock
    10070   25      3       In Stock
    10071   20      0       In Stock
    10071   20      1       In Stock
    10071   20      29991   In Stock
    10072   32      0       In Stock
    10072   32      1       In Stock
    10072   32      29978   In Stock
    10204   0       0       Out of Stock
    10204   0       1       In Stock
    10204   0       4       In Stock
    10204   0       29996   Out of Stock

但我不能让它像我想要的那样工作,因为 QtyStore 列不 SUM() 它重复,因为 tb_StoreProdAddress 用于多个商店,因此多个商店可以拥有相同的产品,但每个商店可能有该产品的不同地址,但仓库中给定产品的地址是相同的。

有一种方法可以对 QtyStore 列进行 SUM() 并将 qty_wh 分组???

【问题讨论】:

  • 你不能使用 sum 的原因是它在 group by 子句中。您是否尝试过将 QtyStore 列从 group by 子句中取出?

标签: sql sql-server


【解决方案1】:

您可以尝试最大化 qty_wth,然后像这样对 QtyStore 求和:

SELECT Product_Cod, max(qty_wh) as qty_wh, sum(QtyStore) as QtyStore,
    CASE
        WHEN sum(QtyStore) BETWEEN 1 AND 20000 THEN 
                            CASE
                                    WHEN qty_wh > 0 THEN 'In Stock'
                                    WHEN qty_wh = 0 THEN 'In Stock'
                            END
        WHEN sum(QtyStore) = 0 OR sum(QtyStore) > 20000 THEN
                            CASE
                                    WHEN qty_wh <= 0 THEN 'Out of Stock'
                                    WHEN qty_wh > 0 THEN 'in Stock'
                            END
END AS [Result]
FROM tb_Products, tb_qtyStock, tb_StoreProdAddress
WHERE Product_Cod = wh_CodProduct
AND Product_Cod = Store_CodProduct
GROUP BY Product_Cod
ORDER BY Product_Cod

【讨论】:

    【解决方案2】:

    为避免多次执行相同的操作,您可以在子查询中进行计算:

    SELECT Product_Cod,
           qty_wh,
           QtyStore,
           CASE
              WHEN QtyStore BETWEEN 1 AND 20000
              THEN
                 CASE
                    WHEN qty_wh > 0 THEN 'In Stock'
                    WHEN qty_wh = 0 THEN 'In Stock'
                 END
              WHEN QtyStore = 0 OR QtyStore > 20000
              THEN
                 CASE
                    WHEN qty_wh <= 0 THEN 'Out of Stock'
                    WHEN qty_wh > 0 THEN 'in Stock'
                 END
           END AS [Result]
        FROM (SELECT Product_Cod,
                   MAX (qty_wh) AS qty_wh,
                   SUM (QtyStore) AS QtyStore,
                   FROM tb_Products,
                   tb_qtyStock,
                   tb_StoreProdAddress 
                 WHERE Product_Cod = wh_CodProduct
                 AND Product_Cod = Store_CodProduct
                 GROUP BY Product_Cod)
        ORDER BY Product_Cod
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      只需从 GROUP BY 子句中删除 QtyStore 列,然后将 SUM(QtyStore) 放入查询的 SELECT 部分。

      SELECT Product_Cod, qty_wh, SUM(QtyStore) AS TotalQtyStore,
          CASE
              WHEN sum(QtyStore) BETWEEN 1 AND 20000 THEN 
                                      CASE
                                              WHEN qty_wh > 0 THEN 'In Stock'
                                              WHEN qty_wh = 0 THEN 'In Stock'
                                      END
              WHEN sum(QtyStore) = 0 OR sum(QtyStore) > 20000 THEN
                                      CASE
                                              WHEN qty_wh <= 0 THEN 'Out of Stock'
                                              WHEN qty_wh > 0 THEN 'in Stock'
                                      END
          END AS [Result]
      FROM tb_Products, tb_qtyStock, tb_StoreProdAddress
      WHERE Product_Cod = wh_CodProduct
      AND Product_Cod = Store_CodProduct
      GROUP BY Product_Cod, qty_wh
      ORDER BY Product_Cod
      

      【讨论】:

      • 谢谢丹!我很确定我昨天尝试过,但在某个地方搞砸了,因为实际的查询有更多的方法,这是它的简短版本,但现在它就像一个魅力!盲点,猜猜只是需要另一双眼睛才能看到我的错误XD
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 2017-08-20
      • 1970-01-01
      • 2021-05-19
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多