通过省略 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

Demo on dbfiddle

如果您的环境不支持 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

Demo on dbfiddle