Sql Server多行合并及分组查询的例子

发布时间:2020-07-15编辑:脚本学堂
本文介绍下,在sql server中,进行多行合并成一行,以及分组查询统计的例子。有需要的朋友,可以参考学习下。

来看下面这个例子。
 

复制代码 代码示例:

--创建 test 表 ,插入数据
CREATE TABLE test(code varchar(50), [values] varchar(10),[count] int)
INSERT test SELECT '001', 'aa',1
UNION ALL SELECT '001', 'bb',2
UNION ALL SELECT '002', 'aaa',4
UNION ALL SELECT '002', 'bbb',5
UNION ALL SELECT '002', 'ccc',3;

--方法一
--将多行合并成一行,并做分组统计
SELECT code,
[values] =
stuff(b.[values].value('/R[1]', 'nvarchar(max)'),
,
,
''),[count]
FROM (SELECT code,sum([count]) as [count]
FROM test
GROUP BY code) a
CROSS apply (
SELECT [values] =(
SELECT N',' + [values] FROM test
WHERE code = a.code
FOR XML PATH(''), ROOT('R'), TYPE
)
) b;

--方法二
---sql2005中的新解法 使用XML
SELECT code, data=STUFF((SELECT ','+[values] FROM test t WHERE code=t1.code FOR XML PATH('')), 1, 1, ''),sum([count]) as [count]
FROM test t1
GROUP BY code
--查询结果
--001 aa,bb 3
--002 aaa,bbb,ccc 12
drop table test

附1,Sql Server 分组统计并合计总数及WITH ROLLUP应用

WITH ROLLUP 在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。
 

复制代码 代码示例:
SELECT [Source], COUNT(*) AS OrderTotal FROM [ExternalOrder]
Where OrderStatus=1 AND (CheckPayment=1 ) and TicketDate >= '2012-11-1' AND TicketDate < '2012-12-1'
GROUP BY [Source]
WITH ROLLUP Order by [Source] desc

结果集:
 

Source OrderTotal
ZongHengV2 215
ZongHeng 3889
YixingSky 3919
YiSkyV2 901
Wanggou 1034
Uni800 1151
TaoBao 3876
ShanglvPT 897
Shanglvbao 426
Qunar 9878
PiaoMeng 429
KuXun 1549
JinRi 2661
HangTuo 140
HangLvTong 7
EasyGo 501
Aooxing 5458
AirPP 3299
yi 8677
Book 2401
19479
NULL 70787

附2,一个sql分组统计的例子
现有人口信息表,表中有字段年龄(整型),性别(字符)
要求统计不同年龄段的男女比例,形成如下表格
 

年龄          男       女
---------------------------
18以下
18-30
30-40
40-50
50-60
60以上
 

实现分组查询统计的sql实例:
 

复制代码 代码示例:
select 年龄,sum(男),sum(女) 
from 

    select 
          case when 年龄<18 then '18以下' else  
          case when 年龄>=18 and 年龄<30 then '18-30' else  
          case when 年龄>=30 and 年龄<40 then '30-40' else  
          case when 年龄>=40 and 年龄<50 then '40-50' else  
          case when 年龄>=50 and 年龄<60 then '50-60' else  
          case when 年龄>=60 then '60以上'  
          else '其他'  end end end end end as 年龄, 
 
          case when 性别='男' then 1 else 0 end as 男, 
 
          case when 性别='女' then 1 else 0 end as 女 
     from 人口信息表 
) as T 
group by T.年龄 
order by T.年龄