[英]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
您可以在子查詢中使用 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.