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

时间:2015-02-26 15:58:39

标签: sql-server group-by

我有一个复杂的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中ifgoring“specialValue”,我会得到以下结果:

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

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

由于

3 个答案:

答案 0 :(得分:0)

您可能希望了解使用多维数据集和/或汇总。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

怎么样?
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 Server 1 的版本。

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