I have a table that may have the same item but with different sizes, I would like to count those items with more than one size (e.g. marvel shirt with S, M sizes will count as “1”), but still be able to count how many S and M. I have 2 outcomes I would like to get. Please see below for more detail.
TABLE B ITEM_NO ITEM ========================= 3130C MARVEL_SHIRT 1845C SPONGEBOB_BOXERS A900C CK_COAT A988C RIDER_JEANS TABLE C ITEM_NO SIZE =============== 3130C S 3130C M 1845C M A900C L A988C M -
I tried just counting it but it is incorrect since it counts how many distinct sizes are there
select (case substr(item_no, 5, 1) when 'C' then 'clothes' when 'T' then 'toys' else 'misc' end) inv, count(item_no) total ,sum (case when C.size = 'S' then 1 else 0 end) AS small ,sum (case when C.size = 'M' then 1 else 0 end) AS med ,sum (case when C.size = 'L' then 1 else 0 end) AS large ,count (distinct C.size) AS multiple_sizes from B left outer join C on B.item_no = C.item_no group by substr(item_no, 5, 1);
Actual outcome (incorrect):
INV TOTAL Small Med Large Multiple_Sizes ========================================================== CLOTHES 4 1 3 1 3
Desired/expected outcome:
INV TOTAL Small Med Large Multiple_Sizes ========================================================== CLOTHES 4 1 3 1 1
Below is another possible desired outcome given this scenario: What if those with multiple sizes shouldn’t be counted separately (i.e. Marvel shirt has multiple sizes, thus it won’t count the S or M since it’s already counted under Multiple_Sizes)?
INV TOTAL Small Med Large Multiple_Sizes ========================================================== CLOTHES 4 0 2 1 1
Advertisement
Answer
You probably need to group twice (1) by item number (2) by item category:
SELECT SUBSTR(item_no, 5, 1) AS category , COUNT(*) AS count_products , SUM(count_small) AS small , SUM(count_med) AS med , SUM(count_large) AS large , SUM(CASE WHEN count_small + count_med + count_large > 1 THEN 1 END) AS has_multiple FROM ( SELECT b.ITEM_NO , COUNT(CASE WHEN c.SIZE = 'S' THEN 1 END) AS count_small , COUNT(CASE WHEN c.SIZE = 'M' THEN 1 END) AS count_med , COUNT(CASE WHEN c.SIZE = 'L' THEN 1 END) AS count_large FROM b LEFT JOIN c ON b.item_no = c.item_no GROUP BY b.ITEM_NO ) x GROUP BY SUBSTR(item_no, 5, 1)
| category | count_products | small | med | large | has_multiple | | C | 4 | 1 | 3 | 1 | 1 |
And the variation:
SELECT SUBSTR(item_no, 5, 1) AS category , COUNT(*) AS count_products , SUM(CASE WHEN count_small + count_med + count_large = 1 THEN count_small END) AS small , SUM(CASE WHEN count_small + count_med + count_large = 1 THEN count_med END) AS med , SUM(CASE WHEN count_small + count_med + count_large = 1 THEN count_large END) AS large , SUM(CASE WHEN count_small + count_med + count_large > 1 THEN 1 END) AS has_multiple FROM ( SELECT b.ITEM_NO , COUNT(CASE WHEN c.SIZE = 'S' THEN 1 END) AS count_small , COUNT(CASE WHEN c.SIZE = 'M' THEN 1 END) AS count_med , COUNT(CASE WHEN c.SIZE = 'L' THEN 1 END) AS count_large FROM b LEFT JOIN c ON b.item_no = c.item_no GROUP BY b.ITEM_NO ) x GROUP BY SUBSTR(item_no, 5, 1)
| category | count_products | small | med | large | has_multiple | | C | 4 | 0 | 2 | 1 | 1 |