【问题标题】:How to manipulate GROUP BY rows with ANSISQL?如何使用 ANSISQL 操作 GROUP BY 行?
【发布时间】:2021-08-10 16:30:47
【问题描述】:
SELECT COMMISSION_PCT, COUNT(*)
FROM EMPLOYEES
GROUP BY COMMISSION_PCT;

结果是:

COMMISSION_PCT, COUNT(*)
NULL,72
0.15,5
0.35,3
0.40,1
0.30,7
0.20,7
0.25,6
0.10,6

在这里,我需要将 0.25 添加到 0.2 行,将 0.35 添加到 0.3,但我很好奇如何做到这一点。

这是我想要的结果:

COMMISSION_PCT, COUNT(*)
NULL,72
0.15,5
0.40,1
0.30,10
0.20,13
0.10,6

【问题讨论】:

  • 我很好奇您为什么需要“ANSI SQL”解决方案,因为可能没有 100% 兼容的数据库。
  • “我需要将 0.25 添加到 0.2 行,将 0.35 添加到 0.3”的逻辑是什么。必须有一个通用规则。您可以按照以下答案进行操作,但我认为通用规则将有助于创建通用 sql。

标签: sql ansi-sql


【解决方案1】:

您将使用case 表达式:

select (case when commission_pct in (0.20, 0.25) then 0.2
             when commission_pct in (0.30, 0.35) then 0.3
             else commission_pct
        end) as commission_pct,
       count(*)
from employees e
group by (case when commission_pct in (0.20, 0.25) then 0.2
               when commission_pct in (0.30, 0.35) then 0.3
               else commission_pct
          end);

【讨论】:

  • 请注意,ANSI SQL 不允许在 GROUP BY 子句中使用 case 表达式。
  • @jarlh 。 . .你确定吗?它不允许别名,所以需要子查询?
  • 是的,非常确定,子查询是必需的。但是,当然,大多数产品都允许在 GROUP BY 子句中使用表达式。
  • @jarlh 。 . .我认为几乎每个数据库都可以(包括 Oracle 的古老版本)——尽管有一个(可能是 Hive)需要别名并且不允许表达式。
【解决方案2】:

ANSI SQL 兼容解决方案:

select commission_pct, count(*)
from
(
    select case when commission_pct in (0.25, 0.35) then commission_pct - 0.05
                else commission_pct
           end as commission_pct
    from employees
) e
group by commission_pct

使用了 Core SQL-2016 之外的以下功能:F591,派生表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多