【问题标题】:Group by like SQL query按类似 SQL 查询分组
【发布时间】:2019-01-07 04:26:24
【问题描述】:

我有一个包含数据(例如)的表(reason_table):

request_id          created_time            type             detail
asdas232          2018-07-29 00:00:01      NO_VALID        No valid offer for id asdas232
aseeas232         2018-07-29 00:00:02      NO_VALID        Not default offer for id aseeas232

我正在尝试根据详细信息(如上)来获取计数:

invalidOffer = 1
NoDefaultOffer = 1

我试过了:

SELECT detail, count(*)
FROM reason_table 
where "type" like '%NO_VALID%'
and created_time >=  '2018-07-29 00:00:00'
and created_time <=  '2018-07-29 00:00:10'
GROUP BY
    CASE
        WHEN detail LIKE '%invalid%' THEN 'invalidOffer'
        WHEN detail LIKE '%default%' THEN 'NoDefaultOffer'
        ELSE NULL
    END

但出现错误提示 SQL Error [500310] [42803]: [ Invalid operation: column "detail" must appear in the GROUP BY clause or be used in an aggregate function;

有人能帮我找出我做错了什么吗? 我正在使用 DBeaver 从 redshift 中查询数据

【问题讨论】:

  • 您正在按不在结果集中的列进行分组。你想在这里做什么?您使用的是哪个 DBMS? sql server mysql.
  • 有点迂腐...不是他们按不在结果集中的列进行分组;这实际上是相当普遍的。这是他们选择的列不在group by 列表中。

标签: mysql sql sql-server group-by case


【解决方案1】:

将表达式移至select

SELECT (CASE WHEN detail LIKE '%invalid%' THEN 'invalidOffer'
             WHEN detail LIKE '%default%' THEN 'NoDefaultOffer'
        END) as detail_group,
        count(*)
FROM reason_table 
WHERE "type" like '%NO_VALID%' AND
      created_time >=  '2018-07-29 00:00:00' AND
      created_time <=  '2018-07-29 00:00:10'
GROUP BY (CASE WHEN detail LIKE '%invalid%' THEN 'invalidOffer'
               WHEN detail LIKE '%default%' THEN 'NoDefaultOffer'
          END);

【讨论】:

  • SELECT (CASE WHEN detail LIKE '%invalid%' THEN 'invalidOffer' WHEN detail LIKE '%default%' THEN 'NoDefaultOffer' END) as detail_group, count(*) FROM reason_table WHERE "type"像 '%NO_VALID%' AND created_time >= '2018-07-29 00:00:00' AND created_time
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2018-09-16
  • 2010-12-12
  • 2015-10-17
相关资源
最近更新 更多