代码之家  ›  专栏  ›  技术社区  ›  user8512043

用户出勤日期年份和月份

  •  0
  • user8512043  · 技术社区  · 7 年前

    我有一个要求,显示用户每年和每月的出席情况。这是一个样本 外观——非常基本:

    Year - Jan - Feb
    2018 - 26  - 20
    2019 - 20  - 22
    

    数据是从单个表中检索的,我尝试了以下查询 为此:

    SELECT EXTRACT(YEAR FROM M.DATE) "YEAR",
    COUNT(CASE WHEN EXTRACT(MONTH FROM M.DATE)  = '1' THEN M.Id ELSE '-' END) "Jan",
    COUNT(CASE WHEN EXTRACT(MONTH FROM M.DATE)  = '2' THEN M.Id ELSE '-' END) "Feb"
    FROM TABLE m 
    WHERE M.STATUS = 'P' AND M.Id = '12345678'
    GROUP BY EXTRACT(YEAR FROM M.DATE) ORDER BY EXTRACT(YEAR FROM M.DATE);
    

    不幸的是,这并没有返回预期的数据,而是显示了年度数据 用户每月的出勤情况如下:

    Year - Jan - Feb
    2018 - 292 - 292
    2019 - 100 - 100
    

    我错过什么了吗?任何想法都将不胜感激。

    0 回复  |  直到 7 年前
        1
  •  1
  •   mkRabbani    7 年前

    试试这个-

    SELECT EXTRACT(YEAR FROM M.DATE) "YEAR",
    COUNT(CASE WHEN EXTRACT(MONTH FROM M.DATE)  = '1' THEN M.Id ELSE NULL END) "Jan",
    COUNT(CASE WHEN EXTRACT(MONTH FROM M.DATE)  = '2' THEN M.Id ELSE NULL END) "Feb"
    FROM TABLE m 
    WHERE M.STATUS = 'P' AND M.Id = '12345678'
    GROUP BY EXTRACT(YEAR FROM M.DATE) ORDER BY EXTRACT(YEAR FROM M.DATE);
    

    或者-

    SELECT EXTRACT(YEAR FROM M.DATE) "YEAR",
    SUM(CASE WHEN EXTRACT(MONTH FROM M.DATE)  = '1' THEN 1 ELSE 0 END) "Jan",
    SUM(CASE WHEN EXTRACT(MONTH FROM M.DATE)  = '2' THEN 1 ELSE 0 END) "Feb"
    FROM TABLE m 
    WHERE M.STATUS = 'P' AND M.Id = '12345678'
    GROUP BY EXTRACT(YEAR FROM M.DATE) ORDER BY EXTRACT(YEAR FROM M.DATE);
    
        2
  •  1
  •   Gordon Linoff    7 年前

    我更喜欢使用 SUM() 为了这个。但更重要的是,你的代码是混合类型的。 EXTRACT() 返回一个 数字 所以比较应该是一个数字。我建议:

    SELECT EXTRACT(YEAR FROM M.DATE) as "YEAR",
           SUM(CASE WHEN EXTRACT(MONTH FROM M.DATE) = 1 THEN 1 ELSE 0 END) as "Jan",
           SUM(CASE WHEN EXTRACT(MONTH FROM M.DATE) = 2 THEN 1 ELSE 0 END) as "Feb"
    FROM TABLE m 
    WHERE M.STATUS = 'P' AND
          M.Id = 12345678  -- I am guessing that `id` is also a number
    GROUP BY EXTRACT(YEAR FROM M.DATE)
    ORDER BY EXTRACT(YEAR FROM M.DATE);
    

    你应该小心混合不同的类型。转换可能会妨碍优化器找到最佳查询计划的能力。