'SQL - subqueries with two data sets
I have two input data tables, one for 2021 and one for 2022. And I would like to have one column per year (unitédoeuvre21 for 2021, and unitédoeuvre22 for 2022) based on certain conditions. But I can't do it. I would like something like this :
user_id app object unitédoeuvre21 unitédoeuvre22
abc Dapp sho 256 245
Here is my code:
SELECT
COALESCE (ac2021.user_id,ac2021.user_id) as user_id,
COALESCE (ac2021.app,ac2022.app) as app,
COALESCE (ac2021.object,ac2022.object) as object
FROM
(SELECT app, user_id, object, unitédoeuvre21, unitédoeuvre22
FROM
(SELECT ac2021.app
, user_id
, object
, SUM(qt) * CASE object
WHEN 'sho' THEN 14
WHEN 'Coa' THEN 37
ELSE NULL
END as unitédoeuvre21
FROM achat2021
WHERE app IN (
'sorena'
,'ReqStat'
,'Dapp'
)
GROUP BY
app
, object
, user_id) as ac2021
FULL JOIN
(SELECT ac2022.app
, user_id
, object
, SUM(qt) * CASE object
WHEN 'sho' THEN 14
WHEN 'Coa' THEN 37
ELSE NULL
END as unitédoeuvre22
FROM achat2022
WHERE app IN (
'sorena'
,'ReqStat'
,'Dapp'
)
GROUP BY
app
, object
, user_id) as ac2022
ON ((ac2021.user_id = ac2022.user_id) AND (ac2021.app = ac2022.app) AND (ac2021.object = ac2022.object))) as ac2122
I have the error :
missing FROM-clause entry for table "ac2021" line 8
Solution 1:[1]
I don't have anywhere to test it but something like this should work (I've split it into CTEs to show the logical steps):
WITH YEAR_2021 AS (
SELECT ac2021.app
, user_id
, object
, SUM(qt) * CASE object
WHEN 'sho' THEN 14
WHEN 'Coa' THEN 37
ELSE NULL
END as unitédoeuvre21
, NULL AS unitédoeuvre22
FROM achat2021
WHERE app IN (
'sorena'
,'ReqStat'
,'Dapp'
)
GROUP BY USER_ID, APP, OBJECT
),
YEAR_2022 AS (
SELECT ac2022.app
, user_id
, object
, NULL AS unitédoeuvre21
, SUM(qt) * CASE object
WHEN 'sho' THEN 14
WHEN 'Coa' THEN 37
ELSE NULL
END as unitédoeuvre22
FROM achat2022
WHERE app IN (
'sorena'
,'ReqStat'
,'Dapp'
)
GROUP BY USER_ID, APP, OBJECT
),
BOTH_YEARS AS (
SELECT USER_ID
,APP
,OBJECT
,unitédoeuvre21
,unitédoeuvre22
FROM YEAR_2021
UNION ALL
SELECT USER_ID
,APP
,OBJECT
,unitédoeuvre21
,unitédoeuvre22
FROM YEAR_2022
)
SELECT USER_ID
,APP
,OBJECT
,SUM(unitédoeuvre21) AS unitédoeuvre21
,SUM(unitédoeuvre22) AS unitédoeuvre22
FROM BOTH_YEARS
GROUP BY USER_ID, APP, OBJECT;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | NickW |
