SQL Server 中多行多列串連成為單行單列

來源:互聯網
上載者:User
原始結構

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 連成一列。
不知如何描述此種用法,是否具有像交叉表相關的 Cross-Table 和 Pivot  之類的約定成熟的專業稱謂?
是否也可以稱為另一種 Cross-Table ?
此需求應該是常見的,網上也有許多DEMO現簡單實現一個DEMO,以便參考。-- 多行多列串連成為單行單列樣本:需要一個自訂函數

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzSample]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[VertToHorzSample]
GO

-- 建立測試資料
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 [()function [dbo].[ConvertVertToHorz]
GO

-- 建立輔助函數
CREATE Function ConvertVertToHorz()FUNCTION ConvertVertToHorz(@Col1Val int)
RETURNS VARCHAR(8000)
AS
    BEGIN 
        -- 實際項目中,應該考慮 @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
*/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.