将汇总汇总为友好的文本

时间:2020-08-21 18:51:10

标签: sql sql-server

这是我在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

有人知道我该怎么做吗?

2 个答案:

答案 0 :(得分:4)

现代版本

如果在SQL Server 2017或更高版本上,您也可以通过这种方式进行操作(这样可以避免您必须事先知道和硬编码所有可能的等级AB,{ {1}}等,这使得以后很难添加CD等):

E

输出

A的总数:7,A的总数:1329-B的总数:5,B的总数:984-C的总数:3,C的总数:576


2012、2014、2016

如果在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、2008 R2

如果您使用的是早期版本(不受支持和不建议使用)(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, '');

示例

Working dbfiddle using a table variable

答案 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;