国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

Sql Server 列轉行 Pivot使用

2024-08-31 00:54:32
字體:
來源:轉載
供稿:網友
Sql Server 列轉行 Pivot使用

今天正好做 數據展示,用到了列轉行,行轉列有多種方式,Pivot是其中的一種,Povit 是sql server 2005以后才出現的功能,

下面的業務場景:

每個月,進貨渠道的總計數量【Total】,有中文,英文年月,等數據列,

原始數據如下:

需求:

需要把數據按每一年的1月到12月展示成一行,如上圖,怎么辦?Povit排上用場了

有的年,可能不是每個月都有,也就是動態列的生成了。

首先要做的就是構建1到12月,

DECLARE @temp NVARCHAR(max)=''SELECT @temp=COALESCE(@temp,'')+ '['+  Monthly+'],'FROM (SELECT DISTINCT Monthly FROM  [DMS_SourceofBusiness]WHERE Yearly='2006') aset @temp=SUBSTRING(@temp,1,LEN(@temp)-1)

查詢一下是否生成了呢?SELECT @temp

果然如此,

下一步就是把這些動態列作為生成數據的列,

DECLARE @sql NVARCHAR(max)=''SET @sql='SELECT Source,Yearly'+@temp+' from(SELECT Source,Yearly,Monthly,Total FROM  [dbo].[DMS_SourceofBusiness])c pivot( MAX(Total)for Monthly IN('+ @temp+'))b where  Yearly=''2006'' and Source like''%Customer walk-in%'''PRINT @sqlEXEC(@sql) 

執行之后,就如上面的的預期的顯示結果一樣了,

注意:

Pivot語法結構:

Pivot (A)forB in(C)

A:Max(Total),表示要顯示的合計值,

B:Monthly,原始數據的列頭,就是要把它的數據轉化為列的字段的名字

C:動態列

-------------------------

方案二:

也可以用case when 來解決,但是這樣的動態的列就會變成固定的列,

應用場景:月份:1-12個月,星期(周一到周天),季度(Q1到Q4)等等

代碼如下:

 SELECT RTRIM(LTRIM(SOB.Source))Source,SOB.Yearly, MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='01' THEN SOB.Total ELSE 0 END  ) AS 'M01' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='02' THEN SOB.Total ELSE 0 END  ) 'M02' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='03' THEN SOB.Total ELSE 0 END  ) 'M03' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='04' THEN SOB.Total ELSE 0 END  ) 'M04' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='05' THEN SOB.Total ELSE 0 END  ) 'M05' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='06' THEN SOB.Total ELSE 0 END  ) 'M06' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='07' THEN SOB.Total ELSE 0 END  ) 'M07' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='08' THEN SOB.Total ELSE 0 END  ) 'M08' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='09' THEN SOB.Total ELSE 0 END  ) 'M09' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='10' THEN SOB.Total ELSE 0 END  ) 'M10' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='11' THEN SOB.Total ELSE 0 END  ) 'M11' ,MAX(CASE WHEN SUBSTRING(SOB.Monthly,6,2)='12' THEN SOB.Total ELSE 0 END  ) 'M12'  FROM [dbo].[DMS_SourceofBusiness] SOB WITH(NOLOCK)WHERE SOB.Yearly ='2015'GROUP BY Source,SOB.Yearly

顯示數據格式:

總結:

根據不同的類型選擇不同的解決方法,

使用Pivot是比較通用的一種方式,但是寫sql或者存儲過程,稍稍復雜一些。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙门县| 枣阳市| 泾川县| 平和县| 济源市| 信阳市| 沁水县| 绵阳市| 建德市| 重庆市| 穆棱市| 如东县| 淮北市| 临澧县| 金山区| 甘南县| 丰镇市| 长武县| 阳信县| 额济纳旗| 乌拉特前旗| 屏东县| 东城区| 威信县| 黄山市| 吉首市| 万州区| 灵山县| 枣强县| 上犹县| 金溪县| 镇赉县| 卢湾区| 新泰市| 宾川县| 新丰县| 都安| 邵武市| 潢川县| 大英县| 金塔县|