簡體   English   中英

根據另一列的值將一列匯總為兩個不同的列

[英]Sum a column into two different columns based on another column's value

我需要的只是“存儲”中的項目列表,但結果集應包括存儲和活動位置中該項目數量的總和。

這是一個數據集示例:

ID 物品 地點 數量
1個 項目A 貯存 4個
2個 項目A 積極的 9
3個 項目B 貯存 3個
4個 項目B 貯存 2個
5個 項目A 積極的 1個
6個 C項 盒裝 3個
7 項目D 積極的 1個
8個 項目D 貯存 1個

結果看起來像這樣:

物品 貯存 積極的
項目A 4個 10
項目B 5個 0
項目D 1個 1個

請注意,不應包含 ItemC,因為它不在有效位置。

到目前為止我嘗試過的是:

SELECT 
    ITEMDESC.A, 
    SUM(CASE WHEN LOCATION.A='Storage' THEN QTY.A ELSE 0 END), 
    SUM(CASE WHEN LOCATION.B='Active'  THEN QTY.B ELSE 0 END)
 FROM       
    ITEMS A, ITEMS B
 INNER JOIN     
    ITEMDESC.A = ITEMDESC.B
 WHERE      
 GROUP BY   
    ITEMDESC.A

但這會返回列出的所有項目。 當我添加類似“WHERE Location.B = 'Storage'”的內容時,它只會對存儲中的項目求和,所有活動位置項目均為 0。

使用WHERE子句只查看有問題的位置:

select
  item,
  sum(case when location = 'Storage' then qty else 0 end) as storage,
  sum(case when location = 'Active' then qty else 0 end) as active
from items
where location in ('Storage', 'Active')
group by item
order by item;

更新

您已在請求中更改所需的 output,並且只需要“存儲”中的項目。 為此,只需添加一個HAVING子句,例如:

select
  item,
  sum(case when location = 'Storage' then qty else 0 end) as storage,
  sum(case when location = 'Active' then qty else 0 end) as active
from items
where location in ('Storage', 'Active')
group by item
having sum(case when location = 'Storage' then qty else 0 end) > 0
order by item;

這應該會給你想要的結果。 其他答案包括不在“存儲”中的值

select 
  item,
  sum(case when location = 'Active' then qty else 0 end) as active_qty,
  sum(case when location = 'Storage' then qty else 0 end) as storage_qty
from *table*
where item in (select item from *table* where location = 'Storage')
group by item
order by item;
Select  item,
        SUM(Case When Location = 'Storage' THEN Qty else 0 END) AS Storage,
        SUM(Case When Location = 'Active' THEN Qty else 0 END) AS Active 
from table1 
where location in ('Storage','Active')
GROUP BY Item

http://sqlfiddle.com/#!9/7339b9a/8

您可以在子查詢中使用 WHERE 子句來識別感興趣的項目,然后在聚合之前使用 JOIN 來過濾行

SELECT 
    A.ITEMDESC, 
    SUM(CASE WHEN A.LOCATION='Storage' THEN A.QTY ELSE 0 END), 
    SUM(CASE WHEN A.LOCATION='Active'  THEN A.QTY ELSE 0 END)
 FROM       
    ITEMS A
 INNER JOIN
    (SELECT DISTINCT ITEMDESC FROM ITEMS WHERE LOCATION='Storage') B
 ON      
    A. ITEMDESC = B.ITEMDESC
 GROUP BY   
    A.ITEMDESC

或者您可以在聚合后使用 HAVING 子句過濾行

SELECT 
    ITEMDESC, 
    SUM(CASE WHEN LOCATION='Storage' THEN QTY ELSE 0 END), 
    SUM(CASE WHEN LOCATION='Active'  THEN QTY ELSE 0 END)
 FROM       
    ITEMS
 GROUP BY   
    ITEMDESC
 HAVING
    MAX(CASE WHEN LOCATION='Storage' THEN 1 ELSE 0 END) > 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM