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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值