【问题标题】:Rewrite the query to get output for cross years?重写查询以获得跨年的输出?
【发布时间】:2020-01-24 07:13:29
【问题描述】:
SELECT
         sum(case
                 when "year"  = '2016' then "svalue"
                 ELSE 0
             END) as 'sva_2016',
         sum(case
                 when "year"  = '2017' then "svalue"
                 ELSE 0
             END) as 'sva_2017',
         sum(case
                 when "year"  = '2018' then "svalue"
                 ELSE 0
             END) as 'sva_2018',
         sum(case
                 when "year"  = '2019' then "svalue"
                 ELSE 0
             END) as 'sva_2019',
         sum(case
                 when "year"  = '2016' then "ltr"
                 ELSE 0
             END) as 'lva_2016',
         sum(case
                 when "year"  = '2017' then "ltr"
                 ELSE 0
             END) as 'lva_2017',
         sum(case
                 when "year"  = '2018' then "ltr"
                 ELSE 0
             END) as 'lva_2018',
         sum(case
                 when "year"  = '2019' then "ltr"
                 ELSE 0
             END) as 'lva_2019',
         'Apr 1 - Jan 31' as 'Period',
         "code" as 'FACode'
FROM  "FCJOIN" 
WHERE    "code"  IN
    (
    SELECT "fccode"
    FROM  "fcdetails" 
    )
 AND    "month"  between '04'  and  '12'
 AND    "year"  IN ( '2016'  , '2017'  , '2018'  , '2019'  )
GROUP BY  "code" 

上面的查询给了我正确的输出 svalues 和 ltr

  • 2016 年 4 月至 2016 年 12 月
  • 2017 年 4 月至 2017 年 12 月
  • 2018 年 4 月至 2018 年 12 月
  • 2019 年 4 月至 2019 年 12 月

现在我想获取 svalues 和 ltrs 在

期间的值
  • 2016 年 4 月- 2017 年 1 月
  • 2017 年 4 月- 2018 年 1 月
  • 2018 年 4 月- 2019 年 1 月
  • 2019 年 4 月- 2020 年 1 月

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您可以使用 CAST("year" + '-' + "month" + '-01' AS DATETIME) 来比较操作。

顺便说一句。使用PIVOT 运算符就是一个很好的例子。

【讨论】:

    【解决方案2】:

    将年/月转换为日期并使用日期比较:

    select f.code,
           sum(case when v.dte >= '2016-04-01' and v.dte < '2017-04-01'
                    then f.svalue else 0
               end) as svalue_2016,
           . . . 
           sum(case when v.dte >= '2016-04-01' and v.dte < '2017-04-01'
                    then f.ltr else 0
               end) as ltr_2016,
           . . . 
    from fcjoin f cross apply
         (values (datefromparts(f.year, f.month, 1)) 
         ) v(dte)
    where f.code in (select fd.fccode from fcdetails fd)
    group by code;
    

    我删除了所有双引号,因为它们只会使查询复杂化。

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 2015-03-26
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多