SQL 根据另一列连接列值并使用 GROUP BY 计算出现次数,还包括 CASE 子句
SQL concatenating columns values depending on another column and counting ocurrences with GROUP BY and also including CASE clauses
我正在尝试根据另一列的值 A 连接一列的值 Bs,同时计算所述值 A 的出现次数,最后 select 值 A 的离子取决于C 列和 D
的 CASE 子句的结果
如果我有这个table
COLUMN_A
COLUMN_B
COLUMN_C
COLUMN D
NAME1
A
10
8
NAME2
B
20
15
NAME1
C
15
10
NAME4
D
23
20
NAME3
E
40
43
NAME2
F
10
14
NAME5
G
12
20
我只想select C 列的值大于 D 列的 A 列,计算它发生的次数,最后连接 B 列的值(如果适用),像这样:
COLUMN_A
COLUMN_B
COUNT
NAME1
A, C
2
NAME2
B
1
NAME4
D
1
NAME2
F
1
我已经通过下一个查询设法完成了几乎所有这些
SELECT
CASE WHEN columnc > columnd THEN [columna] ELSE 'Doesnt apply' END as ResultA,
STUFF((
SELECT ',' + columnb as 'data()'
FROM sometable
WHERE (columna = sometable.columna)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS ResultB,
COUNT(*) AS count
FROM sometable
GROUP BY
CASE WHEN columnc > columnd THEN [columna] ELSE 'Doesnt apply' END
HAVING COUNT(*) >= 1
但它会带来所有 B 列值,甚至是 A 列值不存在的值。
这需要一个简单的 where 子句和分组依据:
select column_a
, string_agg(column_b, ', ') as listof_b
, count(*) as match_count
from t
where column_c > column_d
group by column_a
请注意,在您最初的尝试中,for xml 子查询需要 and column_c > column_d
in where 子句。
我正在尝试根据另一列的值 A 连接一列的值 Bs,同时计算所述值 A 的出现次数,最后 select 值 A 的离子取决于C 列和 D
的 CASE 子句的结果如果我有这个table
COLUMN_A | COLUMN_B | COLUMN_C | COLUMN D |
---|---|---|---|
NAME1 | A | 10 | 8 |
NAME2 | B | 20 | 15 |
NAME1 | C | 15 | 10 |
NAME4 | D | 23 | 20 |
NAME3 | E | 40 | 43 |
NAME2 | F | 10 | 14 |
NAME5 | G | 12 | 20 |
我只想select C 列的值大于 D 列的 A 列,计算它发生的次数,最后连接 B 列的值(如果适用),像这样:
COLUMN_A | COLUMN_B | COUNT |
---|---|---|
NAME1 | A, C | 2 |
NAME2 | B | 1 |
NAME4 | D | 1 |
NAME2 | F | 1 |
我已经通过下一个查询设法完成了几乎所有这些
SELECT
CASE WHEN columnc > columnd THEN [columna] ELSE 'Doesnt apply' END as ResultA,
STUFF((
SELECT ',' + columnb as 'data()'
FROM sometable
WHERE (columna = sometable.columna)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,2,'') AS ResultB,
COUNT(*) AS count
FROM sometable
GROUP BY
CASE WHEN columnc > columnd THEN [columna] ELSE 'Doesnt apply' END
HAVING COUNT(*) >= 1
但它会带来所有 B 列值,甚至是 A 列值不存在的值。
这需要一个简单的 where 子句和分组依据:
select column_a
, string_agg(column_b, ', ') as listof_b
, count(*) as match_count
from t
where column_c > column_d
group by column_a
请注意,在您最初的尝试中,for xml 子查询需要 and column_c > column_d
in where 子句。