i have the below table
item | area | qty |
---|---|---|
item 1 | a | 10 |
item 1 | b | 17 |
item 2 | b | 20 |
item 3 | a | 10 |
item 2 | c | 8 |
am looking to have a result in sql as below ( a unique item and a unique area ) :
item | area a | area b | area c |
---|---|---|---|
item 1 | 10 | 17 | 0 |
item 2 | 0 | 20 | 8 |
item 3 | 10 | 0 | 0 |
i do have this query which not giving me what am looking for if the area has been changed or increased also its for 2 columns table not 3 columns:
select
item,
max(case when seqnum = 1 then area end) as area_1,
max(case when seqnum = 2 then area end) as area_2,
max(case when seqnum = 3 then area end) as area_3
from (
select A.*,
row_number() over (partition by item order by area) as seqnum
from A
) A
group by item;
Looking forwards to your kind help
i try to modify the existing query, looking for help to modify and undestand what i was missing to have more knowlage for the furture
CodePudding user response:
If you have a fixed list of areas, then no need for window functions ; you can explicitly filter on each individual value in max()
.
Another fix to your query is to take the max of qty
rather than of area
(whose value is already filtered).
select item,
coalesce(max(case when area = 'a' then qty end), 0) as area_a,
coalesce(max(case when area = 'b' then qty end), 0) as area_b,
coalesce(max(case when area = 'c' then qty end), 0) as area_c
from mytable
group by item