这是我在SQL Server中的表:
number grade weight
--------------------------
1 A 185
2 A 179
3 C 191
4 C 192
5 C 193
6 A 194
7 A 196
8 A 188
9 A 187
10 A 200
11 B 201
12 B 202
13 B 203
14 B 191
15 B 187
,并且我希望此输出在SQL Server中(通过查询返回此文本不起作用):
Count of A : 7 , Sum of A : 1329 - Count of B : 5 , Sum of B : 984 - Count of C : 3 , Sum of C : 576
有人知道我该怎么做吗?
答案 0 :(得分:4)
如果在SQL Server 2017或更高版本上,您也可以通过这种方式进行操作(这样可以避免您必须事先知道和硬编码所有可能的等级A
,B
,{ {1}}等,这使得以后很难添加C
,D
等):
E
输出
A的总数:7,A的总数:1329-B的总数:5,B的总数:984-C的总数:3,C的总数:576
如果在2012年至2016年期间,您不能使用;WITH x AS
(
SELECT g = grade, y = CONCAT('Count$g', COUNT(*), ' , Sum$g', SUM(weight))
FROM dbo.TableName
GROUP BY grade
)
SELECT STRING_AGG(REPLACE(y,'$g',' of ' + g + ' : '),' - ')
WITHIN GROUP (ORDER BY g)
FROM x;
,但是可以使用STRING_AGG()
来实现同一目的:
FOR XML PATH
如果您使用的是早期版本(不受支持和不建议使用)(2005-2008 R2),则只需对后者进行更改即可执行手动字符串连接(和数据类型处理),而不必使用{ {1}}。
;WITH x AS
(
SELECT g = grade, y = CONCAT('Count$g', COUNT(*), ' , Sum$g', SUM(weight))
FROM dbo.TableName
GROUP BY grade
)
SELECT STUFF((
SELECT ' - ' + REPLACE(y, '$g', ' of ' + g + ' : ')
FROM x
ORDER BY g
FOR XML PATH(''),type).value(N'.[1]', N'varchar(max)'), 1, 3, '');
答案 1 :(得分:3)
;with flat_cte as (
select
sum(iif(grade='A', 1, 0)) CountA,
sum(iif(grade='A', weight, 0)) SumA,
sum(iif(grade='B', 1, 0)) CountB,
sum(iif(grade='B', weight, 0)) SumB,
sum(iif(grade='C', 1, 0)) CountC,
sum(iif(grade='C', weight, 0)) SumB
from
MyTable)
select
(concat('[Count of A : ]', cast(CountA as varchar(9)), ' , ',
'[Sum of A : ]', cast(SumA as varchar(9)), ' - ',
'[Count of B : ]', cast(CountB as varchar(9)), ' , ',
'[Sum of B : ]', cast(SumB as varchar(9)), ' - ',
'[Count of C : ]', cast(CountC as varchar(9)), ' , ',
'[Sum of C : ]', cast(SumC as varchar(9)))
from flat_cte;