Reputation: 63
I have the following tables:
Product
PRODUCT_ID PRODUCT_NAME
1 SCREW1.20
2 SCREW1.23
3 SCREW2.5
4 SCREW3.10`
Sales
SALE_ID PRODUCT_ID YEAR QUANTITY PRICE
1 1 2019 14 1.64
2 2 2011 20 2.13
3 3 2018 22 2.29
4 4 2019 18 2.02
5 1 2016 13 2.42
6 2 2019 13 2.36
7 3 2013 20 2.38
8 4 2018 20 2.20
9 1 2010 23 1.69
10 2 2016 22 1.84
11 3 2015 12 1.88
12 4 2009 23 2.47
13 1 2019 14 1.57
14 2 2013 16 1.32
15 3 2016 17 1.66
16 4 2016 16 2.11
17 1 2009 13 2.33
18 2 2015 13 1.84
19 3 2016 12 1.73
20 4 2015 19 1.98
21 1 2018 22 2.17
22 2 2014 21 1.63
23 3 2009 19 1.85
24 4 2010 14 2.17
25 1 2014 13 2.09
26 2 2018 13 1.78
27 3 2011 20 1.34
28 4 2020 22 2.28
29 1 2013 16 1.96
30 2 2016 13 1.37
31 3 2010 21 1.53
32 4 2012 22 2.53
33 1 2019 18 2.57
34 2 2015 22 1.69
35 3 2020 12 2.18
36 4 2019 18 2.63
37 1 2011 21 2.05
38 2 2010 18 1.47
39 3 2012 15 2.37
40 4 2016 21 2.15
41 1 2017 20 1.28
42 2 2019 17 2.13
43 3 2017 14 2.27
44 4 2017 13 1.63
45 1 2009 23 1.89
46 2 2010 13 2.49
47 3 2020 12 2.19
48 4 2009 16 2.34
49 1 2018 13 2.37
50 2 2013 23 1.24
51 3 2011 21 1.58
52 4 2020 21 1.96
53 1 2014 14 1.53
54 2 2015 12 1.85
55 3 2014 13 1.23
56 4 2009 17 2.26
57 1 2017 22 2.41
58 2 2017 20 2.19
59 3 2016 13 1.47
60 4 2018 17 2.05
61 1 2020 15 2.22
62 2 2020 18 1.63
63 3 2016 15 2.67
64 4 2012 18 2.40
65 1 2018 17 2.16
66 2 2017 19 1.57
67 3 2014 23 1.82
68 4 2017 22 2.27
69 1 2019 16 2.65
70 2 2011 16 2.37
71 3 2014 20 1.53
72 4 2014 17 1.81
73 1 2009 23 1.40
74 2 2010 16 2.13
75 3 2013 20 2.27
76 4 2016 17 2.09
77 1 2013 19 2.30
78 2 2016 14 1.40
79 3 2012 12 1.75
80 4 2013 15 1.41
81 1 2015 21 2.30
82 2 2019 16 1.81
I want to find for each year the products which do not have any sales at all
So my train of thought is to find the distinct years for the sales, for each of these iterate for every product, for each product determine the sales: sum(quantity * price)
.
The result would have lines like these
YEAR PRODUCT_NAME Sales
(...)
2011 SCREW3.10 NULL
2012 SCREW3.10 98.96 (<- this record should not appear)
(...)
Upvotes: 0
Views: 61
Reputation: 3526
;WITH Sales_CTE
AS
(
SELECT S.*
FROM Sales AS S
),
Products_CTE
AS
(
SELECT PRODUCT_ID,PRODUCT_NAME
FROM Products
),Years
AS
(
SELECT DISTINCT [Year]
FROM Sales_CTE AS S
GROUP BY [YEAR]
)
SELECT Y.[YEAR],P.PRODUCT_NAME
FROM Years AS Y
CROSS JOIN Products_CTE AS P
WHERE NOT EXISTS(SELECT *
FROM Sales_CTE AS S
WHERE Y.YEAR=S.YEAR AND P.PRODUCT_ID=S.PRODUCT_ID)
Demo: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=75ff5f5bc3d79e348d92b5924af12bad
Upvotes: 0
Reputation: 222722
You can cross join
the products
tabe with the distinct years available in sales
, and then bring the sales
table with a left join
. When the left join
comes up empty, you know you have a product that was not sold on that particular year:
select p.*, y.year
from products p
cross join (select distinct year from sales) y
left join sales s on s.year = y.year and s.product_id = p.product_id
where s.sale_id is null
You can also express this with not exists
instead of left join ... where ... is null
:
select p.*, y.year
from products p
cross join (select distinct year from sales) y
where not exists (
select 1 from sales s where s.year = y.year and s.product_id = p.product_id
)
Upvotes: 1