Reputation: 77
I have a BigQuery with 3 columns: KLIENTNR, REGN_KONTO and BELOEP. I am trying to calculate the sum of the values in the BELOEP column based on the value inside the REGN_KONTO column. I have tried the following query:
SELECT
rh.KLIENTNR,
fk.KLIENTNAVN,
fk.ORGANISASJONSNR,
(SELECT sum(BELOEP) FROM `my_project.my_dataset.Regn_Hovedbok`
WHERE REGN_KONTO >= 3000 AND REGN_KONTO <= 3999
GROUP BY KLIENTNR ) AS INNTEKTER,
(SELECT sum(BELOEP) FROM `my_project.my_dataset.Regn_Hovedbok`
WHERE REGN_KONTO >= 4000 AND REGN_KONTO <= 9999
GROUP BY KLIENTNR ) AS KOSTNADER
FROM `my_project.my_dataset.Regn_Hovedbok` AS rh
JOIN `my_project.my_dataset.Forvaltningsklient` AS fk ON rh.KLIENTNR = fk.KLIENTNR
WHERE
fk.TYPEKODE = 'AS'
GROUP BY
rh.KLIENTNR,
fk.KLIENTNAVN,
fk.ORGANISASJONSNR
ORDER BY
rh.KLIENTNR ;
I get the following error: Scalar subquery produced more than one element
Upvotes: 0
Views: 338
Reputation: 173028
Try below instead
SELECT
rh.KLIENTNR,
fk.KLIENTNAVN,
fk.ORGANISASJONSNR,
(SELECT sum(BELOEP) FROM `my_project.my_dataset.Regn_Hovedbok`
WHERE REGN_KONTO >= 3000 AND REGN_KONTO <= 3999
AND KLIENTNR = rh.KLIENTNR) AS INNTEKTER,
(SELECT sum(BELOEP) FROM `my_project.my_dataset.Regn_Hovedbok`
WHERE REGN_KONTO >= 4000 AND REGN_KONTO <= 9999
AND KLIENTNR = rh.KLIENTNR) AS KOSTNADER
FROM `my_project.my_dataset.Regn_Hovedbok` AS rh
JOIN `my_project.my_dataset.Forvaltningsklient` AS fk
ON rh.KLIENTNR = fk.KLIENTNR
WHERE
fk.TYPEKODE = 'AS'
GROUP BY
rh.KLIENTNR,
fk.KLIENTNAVN,
fk.ORGANISASJONSNR
ORDER BY
rh.KLIENTNR
the reason your original query is failing is because your two subqueries return multiple rows as a result of group by - instead, I think you meant to calculate the sum only for respective client of outside grouping.
Also, consider below further "refactored" version - but it is really depends on what logic you have for your SUMs (the above version respects ignores JOIN while doing SUM, while below version - respects it. But still, depends on what the nature of your data and join - result potentially can be the same)
SELECT
rh.KLIENTNR,
fk.KLIENTNAVN,
fk.ORGANISASJONSNR,
SUM(IF(REGN_KONTO BETWEEN 3000 AND 3999, BELOEP, 0)) AS INNTEKTER,
SUM(IF(REGN_KONTO BETWEEN 4000 AND 9999, BELOEP, 0)) AS KOSTNADER
FROM `my_project.my_dataset.Regn_Hovedbok` AS rh
JOIN `my_project.my_dataset.Forvaltningsklient` AS fk
ON rh.KLIENTNR = fk.KLIENTNR
WHERE
fk.TYPEKODE = 'AS'
GROUP BY
rh.KLIENTNR,
fk.KLIENTNAVN,
fk.ORGANISASJONSNR
ORDER BY
rh.KLIENTNR ;
Upvotes: 1