【问题标题】:Aggregate functions to specific values in a Group By query将函数聚合到 Group By 查询中的特定值
【发布时间】:2014-06-18 11:39:41
【问题描述】:

我有这个数据(例如):

编号 col1 col2 -------------------------------- 5614(空)是 5614 Y(空) 5614 Y(空)

我想获得一行,它告诉我字段是否具有某些值Y

编号 col1 col2 第5614章

如果没有值Y,那么它应该是N

我的实际查询是这样做的,但我认为它应该是一种更短的方式:

SELECT op.id, 
CASE WHEN (SUM(CASE WHEN col1 = 'S' THEN 1 ELSE 0 END)) > 0 THEN 'S' ELSE 'N' END AS col1,
CASE WHEN (SUM(CASE WHEN col2 = 'S' THEN 1 ELSE 0 END)) > 0 THEN 'S' ELSE 'N' END AS col2  
FROM OPERATOR op LEFT JOIN TRAM_OP tr ON op.id = tr.id AND tr.id2 = 20
WHERE op.id = 5614 GROUP BY op.id

如您所见,我有两个表,我需要加入它们以匹配 id2 键。

【问题讨论】:

    标签: sql sqlite group-by


    【解决方案1】:

    一种方法是使用一种速记方式来消除对某些case 语句的需求:

    SELECT op.id, 
           (CASE WHEN SUM(col1 = 'S') > 0 THEN 'S' ELSE 'N' END) AS col1,
           (CASE WHEN SUM(col2 = 'S') > 0 THEN 'S' ELSE 'N' END) AS col2  
    FROM OPERATOR op LEFT JOIN
         TRAM_OP tr
         ON op.id = tr.id AND tr.id2 = 20
    WHERE op.id = 5614
    GROUP BY op.id;
    

    您还可以利用'S' > 'N'

    SELECT op.id, MAX(col1) AS col1, MAX(col2) AS col2  
    FROM OPERATOR op LEFT JOIN
         TRAM_OP tr
         ON op.id = tr.id AND tr.id2 = 20
    WHERE op.id = 5614
    GROUP BY op.id;
    

    但是,这个版本可能会让其他阅读代码的人感到困惑。

    【讨论】:

      【解决方案2】:

      如果Y 是唯一可能的值,那么使用简单的max,您会得到这个值或NULL:

      SELECT id, max(col1) AS col1, max(col2) AS col2
      FROM ...
      WHERE ...
      GROUP BY id
      

      您可以使用ifnull function 将NULL 更改为'N'

      SELECT id,
             ifnull(max(col1), 'N') AS col1,
             ifnull(max(col2), 'N') AS col2
      FROM ...
      WHERE ...
      GROUP BY id
      

      【讨论】:

        【解决方案3】:
        Select ID,
        case when Col1 > 0 then 'Y' else 'N' end 'COL1', 
        case when Col2 > 0 then 'Y' else 'N' end 'COL2' 
        from
        (
            Select id,SUM(case when Col1 = 'y' then 1 else 0 end)'COL1', SUM(
                case when Col2 = 'y' then 1 else 0 end
            )'COL2'
            from #temp
            group by id
        ) t
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          相关资源
          最近更新 更多