科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道解决行转列,列分行,行合并列的疑难问题

解决行转列,列分行,行合并列的疑难问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将为大家解决行转列,列分行,行合并列的疑难问题。

作者:赛迪网 78313 来源:天新网 2008年3月21日

关键字: 数据库 Mssql SQL SQL Server

  • 评论
  • 分享微博
  • 分享邮件

示例2

所谓的多行同组合并

*/

--以ta为例,以cid分组合并,产生如下的数据结果
/*
cid     nameS
1    a,b,c
2    d
3    e,f
*/
--函数实现
CREATE FUNCTION myJoinSTR
(
@cid INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @s VARCHAR(1000)
SELECT @s=ISNULL(@s+',','') + name FROM ta WHERE cid = @cid
RETURN @s
END
GO
SELECT DISTINCT cid,dbo.myJoinSTR(cid) nameS FROM ta
GO

/*

示例3

列拆分为行.

以上例生成的数据格式为示例表,将a,b,c以,分融成行,即上个示例的反操作

*/

SELECT DISTINCT cid,dbo.myJoinSTR(cid) nameS INTO tx FROM ta
GO
SELECT * FROM tx
GO
--以系统表构建identity列,并以连表方式来将列拆成行
SELECT IDENTITY(INT,1,1) id INTO # FROM syscolumns,sysobjects

SELECT id,cid,RIGHT(STUFF(nameS+',',id,LEN(names),''),
CHARINDEX(',',REVERSE(STUFF(','+nameS+',',id,LEN(names),'')))) name
    FROM tx a
INNER JOIN # b
    ON SUBSTRING(names+',',id,1)=','
ORDER BY cid
--以动态语句或循环,或函数的方式略去

示例4

行转列
*/

--单表,以ta为例. 静态行转列,设cid所有出现的可能值已知
SELECT     
    cid_1=MAX(CASE WHEN cid=1 THEN name ELSE NULL END),
    cid_2=MAX(CASE WHEN cid=2 THEN name ELSE NULL END),
    cid_3=MAX(CASE WHEN cid=3 THEN name ELSE NULL END)
    FROM ta 
--单表,以ta为例,动态行转列,设cid所有出现的可能值未知

DECLARE @s VARCHAR(8000)
SET @s=''
SELECT @s=@s + ',cid_' + RTRIM(cid) + '= MAX(CASE WHEN 
cid=' + RTRIM(cid) + ' THEN name ELSE null END) ' 
FROM ta GROUP BY cid
SELECT @s='SELECT ' + STUFF(@s,1,1,'') + ' FROM ta'
--你可以在这里PRINT @s 看看,就知道跟上面的静态行转列一样的了。
 会写静态行转列,就没理由写不出动态的。多表的同理,把多表的静
态行转列写出来,那么动态的也就出来了
EXEC(@s)
GO

DROP TABLE tx,#
GO

DROP TABLE ta,tb
DROP FUNCTION myJoinSTR
GO
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章