通过省略 UNION ALL 来简化查询或重写查询?
Simplify the query or rewriting the query by omitting UNION ALL?
SELECT
'2016 - 17' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2016' AND "month" >= '04')
OR ("year" = '2017' AND "month" <= '01'))
GROUP BY "code"
UNION ALL
SELECT
'2017 - 18' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2017' AND "month" >= '04')
OR ("year" = '2018' AND "month" <= '01'))
GROUP BY "code"
UNION ALL
SELECT
'2018 - 19' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2018' AND "month" >= '04')
OR ("year" = '2019' AND "month" <= '01'))
GROUP BY "code"
UNION ALL
SELECT
'2019 - 20' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2019' AND "month" >= '04')
OR ("year" = '2020' AND "month" <= '01'))
GROUP BY "code"
从上面的查询中,我得到了
期间的 SUM(svalue)
April 2016 - Jan 2017
April 2017 - Jan 2018
April 2018 - Jan 2019
April 2019 - Jan 2020
是否可以简化此查询?我不想要 UNION ALL
- 当我在 zoho 中使用此查询时,它们限制了我在完整查询中使用以获得完整结果的 UNION ALL
(139) 的总数。有什么方法可以重写上面的查询,从而得到相同的结果。谢谢。
您可以通过构建 Years
值然后按它和 code
进行分组来实现。例如:
WITH yearly AS (
SELECT CONCAT(CASE WHEN month < 4 THEN year -1 ELSE year END,
' - ',
CASE WHEN month < 4 THEN year ELSE year + 1 END) AS 'Years',
svalue,
code AS 'FACode'
FROM fcjoin
WHERE code IN (SELECT fccode FROM fcdetails)
AND month = 1 OR month > 3
)
SELECT Years,
SUM(svalue) AS 'Value',
'Sale' AS 'Type',
FACode,
'Apr 1 - Jan 31' AS 'Period'
FROM yearly
GROUP BY Years, FACode
ORDER BY Years, FACode
如果您的环境不支持 CTE,您可以将 yearly
写成子查询:
SELECT Years,
SUM(svalue) AS 'Value',
'Sale' AS 'Type',
FACode,
'Apr 1 - Jan 31' AS 'Period'
FROM (
SELECT CONCAT(CASE WHEN month < 4 THEN year -1 ELSE year END,
' - ',
CASE WHEN month < 4 THEN year ELSE year + 1 END) AS 'Years',
svalue,
code AS 'FACode'
FROM fcjoin
WHERE code IN (SELECT fccode FROM fcdetails)
AND month = 1 OR month > 3
) yearly
GROUP BY Years, FACode
ORDER BY Years, FACode
SELECT
'2016 - 17' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2016' AND "month" >= '04')
OR ("year" = '2017' AND "month" <= '01'))
GROUP BY "code"
UNION ALL
SELECT
'2017 - 18' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2017' AND "month" >= '04')
OR ("year" = '2018' AND "month" <= '01'))
GROUP BY "code"
UNION ALL
SELECT
'2018 - 19' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2018' AND "month" >= '04')
OR ("year" = '2019' AND "month" <= '01'))
GROUP BY "code"
UNION ALL
SELECT
'2019 - 20' as 'Years',
SUM("svalue") as 'Value',
'Sale' as 'Type',
"code" as 'FACode',
'Apr 1 - Jan 31' as 'Period'
FROM "FCJOIN"
WHERE "code" IN
(
SELECT "fccode"
FROM "fcdetails"
)
AND (("year" = '2019' AND "month" >= '04')
OR ("year" = '2020' AND "month" <= '01'))
GROUP BY "code"
从上面的查询中,我得到了
期间的 SUM(svalue)April 2016 - Jan 2017
April 2017 - Jan 2018
April 2018 - Jan 2019
April 2019 - Jan 2020
是否可以简化此查询?我不想要 UNION ALL
- 当我在 zoho 中使用此查询时,它们限制了我在完整查询中使用以获得完整结果的 UNION ALL
(139) 的总数。有什么方法可以重写上面的查询,从而得到相同的结果。谢谢。
您可以通过构建 Years
值然后按它和 code
进行分组来实现。例如:
WITH yearly AS (
SELECT CONCAT(CASE WHEN month < 4 THEN year -1 ELSE year END,
' - ',
CASE WHEN month < 4 THEN year ELSE year + 1 END) AS 'Years',
svalue,
code AS 'FACode'
FROM fcjoin
WHERE code IN (SELECT fccode FROM fcdetails)
AND month = 1 OR month > 3
)
SELECT Years,
SUM(svalue) AS 'Value',
'Sale' AS 'Type',
FACode,
'Apr 1 - Jan 31' AS 'Period'
FROM yearly
GROUP BY Years, FACode
ORDER BY Years, FACode
如果您的环境不支持 CTE,您可以将 yearly
写成子查询:
SELECT Years,
SUM(svalue) AS 'Value',
'Sale' AS 'Type',
FACode,
'Apr 1 - Jan 31' AS 'Period'
FROM (
SELECT CONCAT(CASE WHEN month < 4 THEN year -1 ELSE year END,
' - ',
CASE WHEN month < 4 THEN year ELSE year + 1 END) AS 'Years',
svalue,
code AS 'FACode'
FROM fcjoin
WHERE code IN (SELECT fccode FROM fcdetails)
AND month = 1 OR month > 3
) yearly
GROUP BY Years, FACode
ORDER BY Years, FACode