【SQL】動態行轉列行轉列SQL代碼實現

開始的表是這樣滴

然後輸入SQL語句


select * from (
select ys_Branch.OldBranchDescId, ys_Branch.Name,ys_PayType.PayTypeDesc,ys_Sale.PayPrice 
from ys_SaleDetail 
inner join ys_Sale on ys_SaleDetail.SaleId = ys_Sale.SaleId 
inner join ys_Branch on ys_SaleDetail.BranchId = ys_Branch.BranchId 
inner join ys_SalePayDetail on ys_SaleDetail.SaleId = ys_SalePayDetail.SaleId 
inner join ys_PayType on ys_SalePayDetail.PayType = ys_PayType.PayTypeId 
)as T pivot(sum(T.PayPrice) FOR T.PayTypeDesc in (現金,銀聯卡,Master卡,Visa卡,代金券,儲值卡,支付寶,微信,積分抵扣)) as T

就變成這樣啦~~

 

接下來就是動態行轉列的實現

首先一開始數據源是這樣子的(qty = 銷售數量)

就是有好多好多行啦,我要顯示每個日期的銷售數量,不可能一列列手動綁定的,所以要動態生成這個日期列

於是輸入代碼

if object_id('tempdb..#AS') is not null Begin drop table #AS End  /*刪除可能會創建過的臨時表*/
select * into #AS from 
(select  ys_Branch.Name as 店鋪名字,ys_Staff.name as 銷售員,sum(ys_SaleDetail.Quantity)as qty,ys_SaleDetail.BusinessDate as 日期 
from ys_SaleDetail   
inner join ys_Sale on ys_SaleDetail.SaleId = ys_Sale.SaleId    
inner join ys_Branch on ys_SaleDetail.BranchId = ys_Branch.BranchId   
inner join ys_Staff on ys_SaleDetail.StaffId = ys_Staff.StaffId  
where ys_SaleDetail.BusinessDate between '2019-2-20' and '2019-3-5'  
group by ys_Branch.Name,ys_Staff.name ,ys_SaleDetail.BusinessDate)  a
DECLARE @sql VARCHAR(8000),@col varchar(1000) 
set @col=(select distinct '['+cast(日期 as nvarchar(1000))+'],'  
from #AS for xml path('')) 
set @col=LEFT(@col,LEN(@col)-1) 
set @sql='SELECT * FROM (select * from #AS)  /*數據源*/ AS P PIVOT  ( SUM(qty/*行轉列後 列的值*/) FOR  p.日期/*需要行轉列的列*/ IN ('+@col+'/*列的值*/) ) 
AS T' 
EXEC(@sql)

就變成這樣子啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章