SQL 行轉列

jopen 10年前發布 | 14K 次閱讀 SQL

先建立一張臨時表:
CREATE TABLE #Inpours
(
   [ID]                INT IDENTITY(1,1), 
   [UserName]          NVARCHAR(20),  --游戲玩家
    [CreateTime]        DATETIME,      --充值時間    
    [PayType]           NVARCHAR(20),  --充值類型    
    [Money]             DECIMAL,       --充值金額
    [IsSuccess]         BIT,           --是否成功 1表示成功, 0表示失敗
    CONSTRAINT [PK_Inpours_ID] PRIMARY KEY(ID)

)

添加數據:

INSERT INTO #Inpours SELECT '張三', '2010-06-14', '手機短信', 100, 1
INSERT INTO #Inpours SELECT '李四', '2010-06-14', '手機短信', 100, 1
INSERT INTO #Inpours SELECT '李四', '2010-07-14', '支付寶', 100, 1
INSERT INTO #Inpours SELECT '王五', '2010-07-14', '工商銀行卡', 100, 1
INSERT INTO #Inpours SELECT '趙六', '2010-07-14', '建設銀行卡', 100, 1
INSERT INTO #Inpours SELECT '王五1', '2010-07-22', '招商銀行', 200, 1
INSERT INTO #Inpours SELECT '趙六1', '2010-07-25', '中國郵政儲蓄', 10, 1

 

按支付方式轉行:

(1)

DECLARE @cmdText    VARCHAR(8000); 
DECLARE @tmpSql        VARCHAR(8000); 


SET @cmdText = 'SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,' + CHAR(10); 
SELECT @cmdText = @cmdText + ' CASE PayType WHEN ''' + PayType + ''' THEN SUM(Money) ELSE 0 END AS ''' + PayType  
                + ''',' + CHAR(10)  FROM (SELECT DISTINCT PayType FROM #Inpours ) T 
SET @cmdText = LEFT(@cmdText, LEN(@cmdText) -2) --注意這里,如果沒有加CHAR(10) 則用LEFT(@cmdText, LEN(@cmdText) -1) 
SET @cmdText = @cmdText + ' FROM #Inpours     GROUP BY CreateTime, PayType '; 
SET @tmpSql ='SELECT CreateTime,' + CHAR(10); 
SELECT @tmpSql = @tmpSql + ' ISNULL(SUM(' + PayType  + '), 0) AS ''' + PayType  + ''','  + CHAR(10) 
                    FROM  (SELECT DISTINCT PayType FROM #Inpours ) T 
SET @tmpSql = LEFT(@tmpSql, LEN(@tmpSql) -2) + ' FROM (' + CHAR(10); 
SET @cmdText = @tmpSql + @cmdText + ') T GROUP BY CreateTime '; 
PRINT @cmdText 
EXECUTE (@cmdText);

(2)

有時可能會出現這樣的錯誤:消息 325,級別 15,狀態 1,第 9 行

'PIVOT' 附近有語法錯誤。您可能需要將當前數據庫的兼容級別設置為更高的值,以啟用此功能。有關存儲過程 sp_dbcmptlevel 的信息,請參見幫助。

這個是因為:對升級到 SQL Server 2005 或更高版本的數據庫使用 PIVOT 和 UNPIVOT 時,必須將數據庫的兼容級別設置為 90 或更高。有關如何設置數據庫兼容級別的信息,請參閱 sp_dbcmptlevel (Transact-SQL)。 例如,只需在執行上面腳本前加上 EXEC sp_dbcmptlevel Test, 90; 就OK了, Test 是所在數據庫的名稱

EXEC sp_dbcmptlevel database, 90


SELECT  
        CreateTime, [支付寶] , [手機短信], 
        [工商銀行卡] , [建設銀行卡] ,[中國郵政儲蓄],[招商銀行]
FROM 

    SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,PayType, Money 
    FROM #Inpours 
) P 
PIVOT ( 
            SUM(Money) 
            FOR PayType IN 
            ([支付寶], [手機短信], [工商銀行卡], [建設銀行卡],[中國郵政儲蓄],[招商銀行]) 
      ) AS T 
ORDER BY CreateTime

按人員轉行:

declare @cmdText varchar(8000)
 set @cmdText='select [UserName], '
 select @cmdText=@cmdText+' sum(case payType when'''+payType+'''Then money else 0 end) as '''+payType
 +''','+char(10) from (select Distinct payType from #Inpours) T
 print @cmdText--發現多一個逗號下面把逗號去掉
 set @cmdText=left(@cmdText,len(@cmdText)-2)--去掉逗號
 set @cmdText=@cmdText+'from #Inpours group by userName'
 print @cmdText
 exec(@cmdText)

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!