请教 : 类似行转列问题

Changefish 2006-06-15 06:07:43
这么一个表
编号 值
01 a
01 b
01 c
02 a
02 b
02 c
03 a
03 b
03 d
04 a
04 b
按编号分组 如果他们的值完全相同 则合并一起
编号 值
01、02 a、b、c
03 a
03 b
03 d
04 a
04 b
怎样用SQL实现 谢谢
...全文
248 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcooc 2006-06-16
  • 打赏
  • 举报
回复
强人啊
zjcxc 2006-06-15
  • 打赏
  • 举报
回复
-- sql 2005中可以这样写


-- 示例数据
DECLARE @t TABLE(编号 char(2), 值 varchar(10))
INSERT @t SELECT '01', 'a'
UNION ALL SELECT '01', 'b'
UNION ALL SELECT '01', 'c'
UNION ALL SELECT '02', 'a'
UNION ALL SELECT '02', 'b'
UNION ALL SELECT '02', 'c'
UNION ALL SELECT '03', 'a'
UNION ALL SELECT '03', 'b'
UNION ALL SELECT '03', 'd'
UNION ALL SELECT '04', 'a'
UNION ALL SELECT '04', 'b'

-- 查询处理
;WITH A
AS(
SELECT DATA.编号, A.值
FROM(
SELECT DISTINCT
编号
FROM @t
)DATA
OUTER APPLY(
SELECT 值 = STUFF(REPLACE(REPLACE(
(SELECT v = 值 FROM @t t WHERE 编号 = DATA.编号 FOR XML AUTO),
'<t v="', '、'), '"/>', ''), 1, 1, '')
)A
)
SELECT AA.编号, DATA.值
FROM(
SELECT 值 FROM A
GROUP BY 值
HAVING COUNT(*) > 1
)DATA
OUTER APPLY(
SELECT 编号 = STUFF(REPLACE(REPLACE(
(SELECT v = 编号 FROM A WHERE 值 = DATA.值 FOR XML AUTO),
'<A v="', '、'), '"/>', ''), 1, 1, '')
)AA
UNION ALL
SELECT * FROM @t
WHERE 编号 IN(
SELECT 编号 FROM A
WHERE NOT EXISTS(
SELECT * FROM A AA
WHERE A.值 = AA.值 AND A.编号 <> AA.编号)
)
/*--结果

编号 值
----------------- ---------
01、02 a、b、c
03 a
03 b
03 d
04 a
04 b

(6 行受影响)
--*/
zjcxc 2006-06-15
  • 打赏
  • 举报
回复
楼主这个是怎么合并的?

先按编号分组合并, 再根据合并后的值分组, 合并编号?
wwh999 2006-06-15
  • 打赏
  • 举报
回复
这个要求有些偏激,需要写函数完成...
昵称被占用了 2006-06-15
  • 打赏
  • 举报
回复
写函数实现
不过效率好像不好
fcuandy 2006-06-15
  • 打赏
  • 举报
回复
没看明白。
比如01有a b c
02有a b c
是不是只有当01的所属的集=02所属的集时才合并?

比如01 有a b
02有a b c
此时01所属的集只是02所属的集的子集,此时要不要合并?

27,580

社区成员

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

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