动态支点:每月销售额总和

use*_*947 4 sql-server pivot dynamic-sql

我的表是这样的:

Sitecode    Month  Amount
--------    -----  ------
XX          Jan     1000
XX          Jan     3000
XX          Apr     3000
XX          Apr     1000
Run Code Online (Sandbox Code Playgroud)

我想要的是,显示这样的结果:

Sitecode    MonthJAN   MonthAPR
--------    --------   --------
XX          4000       4000
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 19

正如其他人所说,这被称为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;
Run Code Online (Sandbox Code Playgroud)

请参阅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;
Run Code Online (Sandbox Code Playgroud)

参见SQL Fiddle with Demo

如果您提前知道这些值,则上述两个版本效果很好。如果没有,那么您将使用动态 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)
Run Code Online (Sandbox Code Playgroud)

参见SQL Fiddle with Demo

这的所有 3 个版本都将返回相同的结果:

| SITECODE |  JAN |  APR |
--------------------------
|       XX | 4000 | 4000 |
Run Code Online (Sandbox Code Playgroud)


Lei*_*fel 9

正如马丁史密斯所说,您需要对数据进行透视,无论是使用显式 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;
Run Code Online (Sandbox Code Playgroud)