SQL Server中多行多列連接成為單行單列
原始結(jié)構(gòu):
Column1 Column2
----------- ----------
1 A
1 B
2 C
2 D
2 E
3 F
查詢效果:
Column1 Column2
----------- ------------------
1 A,B
2 C,D,E
3 F
即將 Column1 相同的行的 Column2 連成一列。
不知如何描述此種用法,是否具有像交叉表相關(guān)的 Cross-Table 和 Pivot 之類的約定成熟的專業(yè)稱謂?
是否也可以稱為另一種 Cross-Table ?
此需求應(yīng)該是常見的,網(wǎng)上也有許多DEMO,只是 CSDN 中頻繁有新手提問,現(xiàn)簡單實(shí)現(xiàn)一個DEMO,以便參考。
-- 多行多列連接成為單行單列示例:需要一個自定義函數(shù)
-- http://community.csdn.net/Expert/TopicView3.asp?id=5603231
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzSample]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[VertToHorzSample]
GO
-- 建立測試數(shù)據(jù)
CREATE TABLE VertToHorzSample(
Column1 int,
Column2 varchar(100)
)
GO
INSERT INTO VertToHorzSample(Column1, Column2)
SELECT 1, 'A'
UNION ALL
SELECT 1, 'B'
UNION ALL
SELECT 2, 'C'
UNION ALL
SELECT 2, 'D'
UNION ALL
SELECT 2, 'E'
UNION ALL
SELECT 3, 'F'
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ConvertVertToHorz]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[ConvertVertToHorz]
GO
-- 建立輔助函數(shù)
CREATE FUNCTION ConvertVertToHorz(@Col1Val int)
RETURNS VARCHAR(8000)
AS
BEGIN
-- 實(shí)際項目中,應(yīng)該考慮 @RetVal 是否會超過 8000 個字符
DECLARE @RetVal varchar(8000)
SET @RetVal = ''
-- 通過遞歸 SELECT 連接指定列存儲到臨時變量中
SELECT @RetVal = Column2 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
-- 連接多列
-- SELECT @RetVal = Column2 + ',' + Column3 + ',' + Column4 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
-- 去掉尾巴的 , (逗號)
IF LEN(@RetVal) > 0
SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)
--PRINT @RetVal
RETURN @RetVal
END
GO
-- 測試
SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2 FROM (SELECT DISTINCT Column1 FROM VertToHorzSample) t
/**//*
Column1 Column2
----------- ------------------
1 A,B
2 C,D,E
3 F
*/
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzView]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[VertToHorzView]
GO
-- 可以建立一個視圖
CREATE VIEW dbo.VertToHorzView
AS
SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2
FROM (SELECT DISTINCT Column1 FROM dbo.VertToHorzSample) t
GO
-- 測試視圖
SELECT * FROM VertToHorzView
/**//*
Column1 Column2s
----------- -----------------
1 A,B
2 C,D,E
3 F
*/
