栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

sql:将行的值作为列

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

sql:将行的值作为列

您可以使用“动态旋转”解决问题。请看这篇文章

试试这个

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT)INSERT INTO @t SELECt 1,'2012-01-01 00:00:00.000',500INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450INSERT INTO @t SELECT 2,'2012-09-01 00:00:00.000',300INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750DECLARE @cols AS VARCHAr(MAX), @query  AS VARCHAr(MAX);SELECT     Id_Contract    , LEFt(DATENAME(month,Dt),3) + ' ' + DATENAME(Year,Dt) AS Month_Year_Name    ,AmountINTO #TempFROM @t WHERe Dt BETWEEN  '01/01/2012' AND '03/31/2012'SELECt  @cols = STUFF(( SELECT DISTINCT          '],[' +   t2.Month_Year_Name  FROM    #Temp AS t2  ORDER BY '],[' + t2.Month_Year_Name  FOR XML PATH('')), 1, 2, '') + ']'SET @query = 'SELECt Id_Contract, ' + @cols + ' FROM  (     SELECt          Id_Contract         , Amount         , Month_Year_Name     FROM #Temp) x PIVOT  (      MAX(amount)      FOR Month_Year_Name in (' + @cols + ') ) p 'EXECUTE(@query)DROP TABLE #Temp

// 结果

Id_Contract Jan 2012    Mar 20121500         450

编辑

对于您的测试数据,

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT) INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500 INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450 INSERT INTO @t SELECT 2,'2012-03-01 00:00:00.000',450 INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750

输出是

Id_Contract Jan 2012    Mar 20121   500          4502   NULL         450

让我知道它是否满足要求。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390467.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号