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)