Sql-Server

動態支點:每月銷售額的總和

  • October 1, 2015

我的桌子是這樣的:

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;

請參閱SQL Fiddle with Demo

PIVOT功能在 SQL Server 2005 中可用,因此如果您使用的是該版本或更新的版本,則可以將其應用於您的數據。

靜態樞軸:

select *
from
(
 select sitecode,
   [month],
   amount
 from yourtable
) src
pivot
(
 sum(amount)
 for month in (Jan, Apr)
) piv;

請參閱帶有展示的 SQL Fiddle

如果您提前知道這些值,上述兩個版本會很好用。如果沒有,那麼您將使用動態 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)

請參閱帶有展示的 SQL Fiddle

所有 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;

引用自:https://dba.stackexchange.com/questions/31760