如何實現數據行轉換列顯示


在Insus.NET的blog里,可以找到相關的行列轉換文章。可以點擊下面鏈接 http://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 慢慢看來。
不過,今天Insus.NET再詳細演示一番,望讓網友們更加理解與應用。
還是先來看看實時演示吧:



想實現行與列轉換,得先一弄清楚哪些原數據被轉為列名,哪些原數列名被轉換為行數據。就依上圖來說。原列名[Fruit Name]沒有被轉換,還是作為新表的列名,而原[Kind Name]和[ID]列名被轉換為新[Fruit Name]列的行數據了,而原[Fuit Name]所在行的數據將轉換為列名。

好,我們弄清楚,在存儲過程中,創建一個雛形的臨時表,並插入兩筆數據。



然后,我們宣告一個表變量,你也可以宣告一個臨時表也行。目的是把需要處理的數據先存入這個表變量中。這樣有處理時,不必每次去讀取原始表數據。


接下來,我們開始處理表變量的數據:



上圖的代碼示例中,
#26是找出表變量中[Fruit_nbr]最大的值。
#28至#45行是一個循環塊,只要變量@r小於等於變量@rs,它都會跑,每跑完一遍,變量@r都會在#44行中加1。
#32行代碼,是判斷表變量中是否有跳號的記錄。雖然[Fruit_nbr]的一個自動增長的字段,如果在記錄維護時,有刪除記錄的話,就會出現跳號。因此需要判斷。
#34行代碼,是把當前處理記錄的兩個值,即ID和Kind Name找出來。
#36至#38 行代碼,是修心臨時表,添加一個字段。
#40和#41是對臨時表作更新操作。
#47行代碼是SELECT臨時表所有記錄。


完整的存儲過程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Insus.NET
-- Create date: 2013-09-04
-- Description:    convert row to column.
-- =============================================
CREATE PROCEDURE [dbo].[usp_Fruit_Row2Col]
AS
BEGIN
    IF OBJECT_ID('[dbo].[#DummyTable]') IS NOT NULL
        DROP TABLE [dbo].[#DummyTable]    
    CREATE TABLE  [dbo].[#DummyTable] 
     (   
        [Fruit Name] NVARCHAR(20)
     )       
     INSERT INTO [dbo].[#DummyTable] ([Fruit Name]) VALUES ('Kind Name'),('ID')    


     DECLARE @ft AS TABLE ([Fruit_nbr] INT,[KindName] NVARCHAR(30),[FruitName] NVARCHAR(30))
     INSERT INTO @ft SELECT [Fruit_nbr],[KindName],[FruitName] FROM [dbo].[udf_Fruit]()
     
          
     DECLARE @r INT = 1, @rs INT = 0
     SELECT @rs = MAX(ISNULL([Fruit_nbr],0)) FROM @ft     

     WHILE @r <= @rs 
     BEGIN
        DECLARE @kn NVARCHAR(30), @fn NVARCHAR(20)

        IF EXISTS (SELECT TOP 1 1 FROM @ft WHERE [Fruit_nbr] = @r)
        BEGIN        
            SELECT @kn = [KindName], @fn = [FruitName] FROM @ft WHERE [Fruit_nbr] = @r

            EXECUTE('IF NOT EXISTS(SELECT [name] FROM [tempdb].[dbo].[syscolumns] WHERE [id] = OBJECT_ID(''[tempdb].[dbo].[#DummyTable]'') 
                     AND [tempdb].[dbo].[syscolumns].[name] = '''+ @fn +''')
                     ALTER TABLE [tempdb].[dbo].[#DummyTable] ADD [' + @fn + '] NVARCHAR(100)')

            EXECUTE('UPDATE [dbo].[#DummyTable] SET ['+ @fn +'] = N'''+ @kn +''' WHERE [Fruit Name] = ''Kind Name''')
            EXECUTE('UPDATE [dbo].[#DummyTable] SET ['+ @fn +'] = '''+ @r +''' WHERE [Fruit Name] = ''ID''')    
        
        END
        SET @r += 1
     END

    SELECT * FROM [dbo].[#DummyTable]
END
[dbo].[usp_Fruit_Row2Col]


 在html markup:



cs:




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM