通过...分组。忽略组子句中的值
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_NUMBER
和 OVER
子句的可用性将取决于您的 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
我有一个复杂的 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_NUMBER
和 OVER
子句的可用性将取决于您的 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