I need to compute how many different types of fruit were sold in each county within a certain date range, using county_name
and distinct fruit_code
s.
I got a county
table:
county_code | county_name |
---|---|
1 | Colfax |
2 | Catron |
3 | Harding |
And I got a fruit
table:
county_code | fruit_code | date |
---|---|---|
1 | 1 | 2020-01-01 |
1 | 2 | 2020-01-01 |
1 | 3 | 2020-01-01 |
1 | 4 | 2020-01-01 |
2 | 1 | 2020-01-01 |
2 | 2 | 2020-01-01 |
3 | 1 | 2020-01-01 |
3 | 2 | 2020-01-01 |
3 | 3 | 2020-01-01 |
1 | 1 | 2021-01-01 |
1 | 3 | 2021-01-01 |
2 | 2 | 2021-01-01 |
3 | 2 | 2021-01-01 |
3 | 3 | 2021-01-01 |
So my expected result would be:
county_name | fruit_code |
---|---|
Colfax | 4 |
Catron | 2 |
Harding | 3 |
I tried the following code, but the number of distinct fruit_code
s is not exactly the correct one, unfortunately (note: the actual table is much longer, of course).
WITH unique_fruits AS (
SELECT fruit_code FROM fruit
WHERE date BETWEEN '2020-01-01' AND '2021-01-01'
GROUP BY fruit_code HAVING COUNT(DISTINCT county_code) = 1
)
SELECT c.county_name, COUNT(*) AS no_of_unique_fruits
FROM fruit AS f
JOIN county AS c
ON f.county_code = c.county_code
AND f.fruit_code IN (SELECT fruit_code FROM unique_fruits)
GROUP BY c.county_name
ORDER BY no_of_unique_fruits DESC
What have I forgotten here?
CodePudding user response:
You can solve this easier
WITH fruitcodespercountry AS( SELECT "county_code", COUNT(DISTINCT "fruit_code") fruit_code FROM Fruit WHERE "date" BETWEEN '2020-01-01' AND '2021-01-01' GROUP BY "county_code") SELECT "county_name" ,fruit_code FROM fruitcodespercountry f JOIN country c ON f."county_code" = c."county_code"
county_name | fruit_code :---------- | ---------: Colfax | 4 Catron | 2 Harding | 3
db<>fiddle here
CodePudding user response:
You need a LEFT
join of county
to fruit
(so that you get a result with 0
for counties that do not meet the conditions) and group by county.
Also, the condition about the date should be placed in the ON
clause:
SELECT c.county_name,
COUNT(DISTINCT f.fruit_code) total
FROM county c LEFT JOIN fruit f
ON f.county_code = c.county_code AND date BETWEEN '2020-01-01' AND '2021-01-01'
GROUP BY c.county_code;
I assume that county_code
is the primary key of county
.
See the demo.