【问题标题】:Using CASE WHEN with GROUP BY将 CASE WHEN 与 GROUP BY 一起使用
【发布时间】:2012-11-05 09:04:11
【问题描述】:

背景:我正在尝试显示一个带有标题的表格:id、full_name、position_7、position_8、position_9...等如果某人是 7 月和 8 月的在职员工,那么 2012_Jul 和 2012_Aug 将显示在position_7 和 8 在一条线上。如果我不使用 GROUP BY,我会得到输出但只有 2 行。发生这种情况的原因是,在 BLMths 表中,由于受雇超过 1 个月,一个人将有多个条目。

如果我不使用 GROUP BY,以下查询将成功获取每个人的 id、full_name 和月份。但问题是,如果我忽略使用 GROUP BY,我的表中的每个人都会有 4 行(或更多行)。当我使用 GROUP BY 时,我希望为每个人输出 1 行,但我需要的表中的数据并不全部。

有谁知道我做错了什么?或者有谁知道为什么当我使用 GROUP BY 时,我的一些 CASE 语句中的数据似乎丢失了?

我知道这个问题的答案必须很简单,但我似乎无法解决它。任何帮助表示赞赏。非常感谢。

SELECT Blm.Ags, Blmths.Id, Ie.Full_Name, Blmths.Month,
       CASE month
       WHEN "2012-07-01" THEN 1
           ELSE NULL
       END AS Position_7,
       CASE month
       WHEN "2012-08-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_8,
       CASE Blmths.Month
       WHEN "2012-09-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_9,
       CASE month
       WHEN "2012-10-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_10,
       CASE Blmths.Month
       WHEN "2012-11-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_11,
       CASE Blmths.Month
       WHEN "2012-12-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_12,
       CASE month
       WHEN '2013-01-01' THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_1,
       CASE month
       WHEN "2013-02-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_2,
       CASE month
       WHEN "2012-03-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_3,
       CASE Blmths.Month
       WHEN "2013-04-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_4,
       CASE Blmths.Month
       WHEN "2013-05-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_5,
       CASE Blmths.Month
       WHEN "2013-06-01" THEN Date_Format(Blmths.Month, '%Y_%b')
           ELSE NULL
       END AS Position_6
  FROM Bogus_Leadership_Months AS Blmths, Injection_Employees AS Ie,
Bogus_Leadership_Members AS Blm
  WHERE Blmths.Id = Blm.Id
    AND Ie.Ags = Blm.Ags
    AND Ie.Centre_Id = '666'
  GROUP BY Blm.Ags

【问题讨论】:

  • 我正在尝试显示一个如下所示的表格:
  • @KahlilN:请不要将此类信息放入 cmets,而是编辑您的问题。请查看现有答案,如果它们有效或有什么问题,请提供反馈。
  • @PeterLang - 感谢您的建议。我已编辑问题并删除了评论。

标签: mysql sql group-by case


【解决方案1】:

您需要更加具体。这是针对什么数据库?它以什么方式不起作用?是发生错误还是没有返回您需要的结果? '我需要的表中的数据并不全' 是什么意思?

如果每人有多个记录,您希望如何聚合数据?

我猜你可能想要一些类似的东西(缩短):

SELECT Blm.Ags, Blmths.Id, Ie.Full_Name,
   SUM(CASE Blmths.month
   WHEN "2012-07-01" THEN 1
       ELSE NULL
   END) AS Position_7
FROM Bogus_Leadership_Months AS Blmths, Injection_Employees AS Ie,
Bogus_Leadership_Members AS Blm
  WHERE Blmths.Id = Blm.Id
    AND Ie.Ags = Blm.Ags
    AND Ie.Centre_Id = '666'
  GROUP BY Blm.Ags, Blmths.Id, Ie.Full_Name

这会按月给出那个人的统计数据。

我看不到你所追求的数据示例 - 你能重新发布吗?

【讨论】:

  • 我正在使用 MYSQL,下面的查询出现了一些错误。当我过去得到“'组语句'中的未知列 GRPBYCOL”时,我开始收到错误“字段列表中的未知列”。除此之外,上面的查询是完全我正在尝试做的,它工作完美!非常感谢你:)
【解决方案2】:
 SELECT max(Blmths.Id), Ie.Full_Name, Blmths.Month,Blm.Ags FROM 
    (SELECT Blm.Ags,Blmths.Id, Ie.Full_Name, Blmths.Month 
    CASE month
           WHEN "2012-07-01" THEN 1
               ELSE NULL
           END AS Position_7,
           CASE month
           WHEN "2012-08-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_8,
           CASE Blmths.Month
           WHEN "2012-09-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_9,
           CASE month
           WHEN "2012-10-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_10,
           CASE Blmths.Month
           WHEN "2012-11-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_11,
           CASE Blmths.Month
           WHEN "2012-12-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_12,
           CASE month
           WHEN '2013-01-01' THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_1,
           CASE month
           WHEN "2013-02-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_2,
           CASE month
           WHEN "2012-03-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_3,
           CASE Blmths.Month
           WHEN "2013-04-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_4,
           CASE Blmths.Month
           WHEN "2013-05-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_5,
           CASE Blmths.Month
           WHEN "2013-06-01" THEN Date_Format(Blmths.Month, '%Y_%b')
               ELSE NULL
           END AS Position_6
      FROM Bogus_Leadership_Months AS Blmths, Injection_Employees AS Ie,
    Bogus_Leadership_Members AS Blm
      WHERE Blmths.Id = Blm.Id
        AND Ie.Ags = Blm.Ags
        AND Ie.Centre_Id = '666') AS GRPBYCOL 
   GROUP BY  Ie.Full_Name, Blmths.Month,Blm.Ags,GRPBYCOL 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2022-10-22
    • 2021-03-15
    • 2015-07-21
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多