Sql-Server
動態支點:每月銷售額的總和
我的桌子是這樣的:
Sitecode Month Amount -------- ----- ------ XX Jan 1000 XX Jan 3000 XX Apr 3000 XX Apr 1000
我想要的是,顯示這樣的結果:
Sitecode MonthJAN MonthAPR -------- -------- -------- XX 4000 4000
正如其他人所說,這被稱為
PIVOT
. 您可以通過多種方式將數據從行轉換為數據列。如果您提前知道這些值,那麼您可以對這些值進行硬編碼。在
PIVOT
函式之前,您將使用帶有CASE
語句的聚合函式。聚合/案例版本:
select sitecode, sum(case when [month] = 'Jan' then amount else 0 end) MonthJan, sum(case when [month] = 'Apr' then amount else 0 end) MonthApr from yourtable group by sitecode;
該
PIVOT
功能在 SQL Server 2005 中可用,因此如果您使用的是該版本或更新的版本,則可以將其應用於您的數據。靜態樞軸:
select * from ( select sitecode, [month], amount from yourtable ) src pivot ( sum(amount) for month in (Jan, Apr) ) piv;
如果您提前知道這些值,上述兩個版本會很好用。如果沒有,那麼您將使用動態 sql 來創建結果。
動態樞軸:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT sitecode,' + @cols + ' from ( select sitecode, [month], amount from yourtable ) x pivot ( sum(amount) for month in (' + @cols + ') ) p ' execute(@query)
所有 3 個版本都將返回相同的結果:
| SITECODE | JAN | APR | -------------------------- | XX | 4000 | 4000 |
正如 Martin Smith 所說,您需要對數據進行透視,無論是使用引用的顯式 PIVOT 還是類似的東西(SQL Fiddle):
SELECT SiteCode , SUM(Case When Month='Jan' Then Amount Else 0 End) MonthJan , SUM(Case When Month='Apr' Then Amount Else 0 End) MonthApr FROM Result GROUP BY SiteCode;