通过...分组。忽略组子句中的值

Group by. Ignore value in group clause

我有一个复杂的 sql 查询,其中包含多个连接和子查询。我想知道是否有一种简单的方法可以使用 GROUP BY 子句为分组字段的相同值生成多个组,当这些字段具有一些特殊值时。

例如,如果我按 fieldA 和 fieldB 分组,我会为 fieldA 和 fieldB 的不同值得到分组,但是当 fieldA 取一个特殊的常量值(如 "specialValue")时,会为每个分组生成不同的分组记录.

例如,如果我有这样的记录:

fieldA       | fieldB | fieldC 
_______________________
val1         | val2   | 1
val1         | val2   | 2
val2         | valx   | 3
val2         | valx   | 4
specialValue | vala   | 5
specialValue | vala   | 6

选择 (fieldA, fieldB, max(fieldC)),按 (filedA,fieldB) 分组,但如果在 fieldA 中 "specialValue",我将获得以下结果:

fieldA       | fieldB | fieldC 
_______________________
val1         | val2   | 2
val2         | valx   | 4
specialValue | vala   | 5   <-- Two rows
specialValue | vala   | 6   <--

我想以最简单的方式获取它,如果没有连接或子查询可能的话,因为查询已经太复杂了。

谢谢

您可能需要研究使用多维数据集 and/or 汇总。

table是否有与这些不同的主键列?你可以这样做:

group by case when fieldA = 'specialValue' then primarykey else fieldA end

SELECT fieldA, fieldB, MAX(fieldC)
FROM table
WHERE fieldA <> 'specialValue'
GROUP BY fieldA, fieldB

UNION ALL 

SELECT fieldA, fieldB, fieldC
FROM table
WHERE fieldA = 'specialValue'

?

或者使用 SUBSELECT,尽管 ROW_NUMBEROVER 子句的可用性将取决于您的 SQL Server1 版本.

SELECT fieldA, fieldB, MAX(fieldC)
FROM (
    SELECT fieldA, fieldB, fieldC, 
    case when fieldA = 'specialValue' then 
      ROW_NUMBER() over (ORDER BY fieldA) 
    end as rownum
    FROM t
) as subselect
GROUP BY rownum, fieldA, fieldB

1 2008 年至今 - source