分组查询

wenyiyi 2017-11-14 10:53:18
id sd zl sl
1 A 苹果 3
2 A 西瓜 1
3 B 西瓜 6
4 B 柚子 5
5 C 梨子 3
6 C 西瓜 7
7 C 苹果 4

查询结果 希望是 拼接的。
sd zl
A 苹果,3,西瓜,1
B 西瓜,6,柚子,5
C 梨子3,西瓜,7,苹果,4

怎么才能实现这样的显示效果
...全文
241 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2017-11-15
  • 打赏
  • 举报
回复
引用 4 楼 wwfxgm 的回复:
我给版主的代码 增加了drop table
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
SELECT * from #T
Go
 SELECT  sd ,
            STUFF(( SELECT  ',' + zl+','+RTRIM(sl)
                    FROM    #T
                    WHERE   #T.sd = a.sd
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS zl
    FROM    #T a
    GROUP BY a.sd 
drop table #T;
我想问下为什么要增加这个drop table #t啊,哈哈
wwfxgm 2017-11-15
  • 打赏
  • 举报
回复
我给版主的代码 增加了drop table
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
SELECT * from #T
Go
 SELECT  sd ,
            STUFF(( SELECT  ',' + zl+','+RTRIM(sl)
                    FROM    #T
                    WHERE   #T.sd = a.sd
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS zl
    FROM    #T a
    GROUP BY a.sd 
drop table #T;
二月十六 2017-11-15
  • 打赏
  • 举报
回复
引用 8 楼 wenyiyi 的回复:
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int,[xs] int)
Insert #T
select 1,N'A',N'苹果',3,1 union all
select 2,N'A',N'西瓜',1,2 union all
select 3,N'B',N'西瓜',6,3 union all
select 4,N'B',N'柚子',5,4 union all
select 5,N'C',N'梨子',3,4 union all
select 6,N'C',N'西瓜',7,2 union all
select 7,N'C',N'苹果',4,3
Go

查询结果 希望是这样
SD MX XS
A 苹果,3,西瓜,1 苹果,1,西瓜,2
B 西瓜,6,柚子,5 西瓜,3,柚子,4
C 梨子,3,西瓜,7,苹果,4 梨子,4,西瓜,2,苹果,3


把之前那个稍稍改动一下就是了,多想多动手
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int,[xs] int)
Insert #T
select 1,N'A',N'苹果',3,1 union all
select 2,N'A',N'西瓜',1,2 union all
select 3,N'B',N'西瓜',6,3 union all
select 4,N'B',N'柚子',5,4 union all
select 5,N'C',N'梨子',3,4 union all
select 6,N'C',N'西瓜',7,2 union all
select 7,N'C',N'苹果',4,3
Go
--测试数据结束
SELECT sd ,
STUFF(( SELECT ',' + zl + ',' + RTRIM(sl)
FROM #T
WHERE #T.sd = a.sd
FOR
XML PATH('')
), 1, 1, '') AS MX ,
STUFF(( SELECT ',' + zl + ',' + RTRIM(xs)
FROM #T
WHERE #T.sd = a.sd
FOR
XML PATH('')
), 1, 1, '') AS XS
FROM #T a
GROUP BY a.sd


听雨停了 2017-11-15
  • 打赏
  • 举报
回复
引用 8 楼 wenyiyi 的回复:
[quote=引用 7 楼 sinat_28984567 的回复:]
[quote=引用 6 楼 wenyiyi 的回复:]
[quote=引用 1 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
SELECT sd ,
STUFF(( SELECT ',' + zl+','+RTRIM(sl)
FROM #T
WHERE #T.sd = a.sd
FOR
XML PATH('')
), 1, 1, '') AS zl
FROM #T a
GROUP BY a.sd





如果还要增加一列连接选项。怎么增加呢? 现在是每一个水果种类的数量都连接到一起,显示在一列里了。 要是再增加一个每种水果的销售量,也连接并显示到一列。应该怎么做?[/quote]
给出测试数据和想要的结果[/quote]


Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int,[xs] int)
Insert #T
select 1,N'A',N'苹果',3,1 union all
select 2,N'A',N'西瓜',1,2 union all
select 3,N'B',N'西瓜',6,3 union all
select 4,N'B',N'柚子',5,4 union all
select 5,N'C',N'梨子',3,4 union all
select 6,N'C',N'西瓜',7,2 union all
select 7,N'C',N'苹果',4,3
Go

查询结果 希望是这样
SD MX XS
A 苹果,3,西瓜,1 苹果,1,西瓜,2
B 西瓜,6,柚子,5 西瓜,3,柚子,4
C 梨子,3,西瓜,7,苹果,4 梨子,4,西瓜,2,苹果,3 [/quote]

Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int,[xs] int)
Insert #T
select 1,N'A',N'苹果',3,1 union all
select 2,N'A',N'西瓜',1,2 union all
select 3,N'B',N'西瓜',6,3 union all
select 4,N'B',N'柚子',5,4 union all
select 5,N'C',N'梨子',3,4 union all
select 6,N'C',N'西瓜',7,2 union all
select 7,N'C',N'苹果',4,3
GO
--测试数据结束

SELECT sd,stuff((
SELECT ','+cast(a.zl AS VARCHAR(20))+','+cast(a.sl AS VARCHAR(20)) FROM #t a
WHERE c.sd=a.sd
FOR XML PATH('')
),1,1,'') AS MX,
stuff((
SELECT ','+cast(b.zl AS VARCHAR(20))+','+cast(b.xs AS VARCHAR(20))FROM #t b
WHERE c.sd=b.sd
FOR XML PATH('')
),1,1,'') AS XS
FROM #t c
GROUP BY sd

wenyiyi 2017-11-15
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 wenyiyi 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
 SELECT  sd ,
            STUFF(( SELECT  ',' + zl+','+RTRIM(sl)
                    FROM    #T
                    WHERE   #T.sd = a.sd
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS zl
    FROM    #T a
    GROUP BY a.sd 
如果还要增加一列连接选项。怎么增加呢? 现在是每一个水果种类的数量都连接到一起,显示在一列里了。 要是再增加一个每种水果的销售量,也连接并显示到一列。应该怎么做?[/quote] 给出测试数据和想要的结果[/quote]
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int,[xs] int)
Insert #T
select 1,N'A',N'苹果',3,1 union all
select 2,N'A',N'西瓜',1,2 union all
select 3,N'B',N'西瓜',6,3 union all
select 4,N'B',N'柚子',5,4 union all
select 5,N'C',N'梨子',3,4 union all
select 6,N'C',N'西瓜',7,2 union all
select 7,N'C',N'苹果',4,3
Go
查询结果 希望是这样 SD MX XS A 苹果,3,西瓜,1 苹果,1,西瓜,2 B 西瓜,6,柚子,5 西瓜,3,柚子,4 C 梨子,3,西瓜,7,苹果,4 梨子,4,西瓜,2,苹果,3
二月十六 2017-11-15
  • 打赏
  • 举报
回复
引用 6 楼 wenyiyi 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
 SELECT  sd ,
            STUFF(( SELECT  ',' + zl+','+RTRIM(sl)
                    FROM    #T
                    WHERE   #T.sd = a.sd
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS zl
    FROM    #T a
    GROUP BY a.sd 
如果还要增加一列连接选项。怎么增加呢? 现在是每一个水果种类的数量都连接到一起,显示在一列里了。 要是再增加一个每种水果的销售量,也连接并显示到一列。应该怎么做?[/quote] 给出测试数据和想要的结果
wenyiyi 2017-11-15
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
 SELECT  sd ,
            STUFF(( SELECT  ',' + zl+','+RTRIM(sl)
                    FROM    #T
                    WHERE   #T.sd = a.sd
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS zl
    FROM    #T a
    GROUP BY a.sd 
如果还要增加一列连接选项。怎么增加呢? 现在是每一个水果种类的数量都连接到一起,显示在一列里了。 要是再增加一个每种水果的销售量,也连接并显示到一列。应该怎么做?
jeetliang 2017-11-14
  • 打赏
  • 举报
回复
这是打横显示吧
删库到跑路 2017-11-14
  • 打赏
  • 举报
回复
现在发现悟空的sql语句功底真的很棒
二月十六 2017-11-14
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[sd] nvarchar(21),[zl] nvarchar(22),[sl] int)
Insert #T
select 1,N'A',N'苹果',3 union all
select 2,N'A',N'西瓜',1 union all
select 3,N'B',N'西瓜',6 union all
select 4,N'B',N'柚子',5 union all
select 5,N'C',N'梨子',3 union all
select 6,N'C',N'西瓜',7 union all
select 7,N'C',N'苹果',4
Go
--测试数据结束
SELECT sd ,
STUFF(( SELECT ',' + zl+','+RTRIM(sl)
FROM #T
WHERE #T.sd = a.sd
FOR
XML PATH('')
), 1, 1, '') AS zl
FROM #T a
GROUP BY a.sd


27,578

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧