如何格式化SQL查询?使用Pivot?

时间:2016-02-19 22:38:57

标签: sql-server pivot

这是我的查询。我得到的结果是正确的,但我无法以所需的格式获得它。我试过使用Pivot,但是我收到了错误。有什么想法吗?

查询:

DECLARE @SMonth DATETIME

SET @SMonth = '12/01/2015'

SELECT
    SMonth 'Sales Month',
    c.CustNumber 'Customer',
    b.Description 'Brand',
    Sum (SaleQuantity) 'Qty'

FROM
    DistStructure.Customer c
    JOIN Sales.Sale s ON s.CustId = c.CustId
    JOIN Sales.Import i on i.ImportRefId = s.ImportRefId
    JOIN AppSecurity.Log l on l.LogId = s.ImportRefId
    JOIN Sales.Prod p on p.ProdId = s.ProdId
    JOIN Sales.Brand b on b.BrandId = p.BrandId

WHERE
    s.SMonth = @SMonth AND
    i.ImportStatId = 50 

Group By
    CustNumber,
    SMonth,
    Description

Order By
    CustNumber

查询结果:

Sales Month                Customer    Brand    Qty
----------------------------------------------------
2015-12-01 00:00:00.000    030554      FS       29
2015-12-01 00:00:00.000    030554      BS       5
2015-12-01 00:00:00.000    032204      FZ       21
2015-12-01 00:00:00.000    032204      BS       14
2015-12-01 00:00:00.000    032204      FS       114
2015-12-01 00:00:00.000    034312      FZ       8
2015-12-01 00:00:00.000    034312      FS       104
2015-12-01 00:00:00.000    034312      BS       16
2015-12-01 00:00:00.000    034983      FS       63
2015-12-01 00:00:00.000    034983      BS       18
2015-12-01 00:00:00.000    034983      FZ       3

所需格式:

注意:客户应按品牌汇总(因此每个客户只有一行),然后汇总。如果品牌没有数据,则应该在现场放置零。

Sales Month                Customer    BS    FS    FZ   Total
--------------------------------------------------------------
2015-12-01 00:00:00.000    030554      5     29    0    34
2015-12-01 00:00:00.000    032204      14    114   21   149
2015-12-01 00:00:00.000    034312      16    104   8    128
2015-12-01 00:00:00.000    034983      18    63    3    84

2 个答案:

答案 0 :(得分:3)

以下是使用Conditional Aggregate更改现有查询以获得所需结果格式的一种方法。

;with cte as
(
SELECT [Sales Month]=SMonth,
       [Customer]= c.CustNumber,
       [BS] = Sum(CASE WHEN b.Description = 'BS' THEN SaleQuantity ELSE 0 END),
       [FS]= Sum(CASE WHEN b.Description = 'FS' THEN SaleQuantity ELSE 0 END),
       [FZ]= Sum(CASE WHEN b.Description = 'FZ' THEN SaleQuantity ELSE 0 END)
FROM   DistStructure.Customer c
       JOIN Sales.Sale s
         ON s.CustId = c.CustId
       JOIN Sales.Import i
         ON i.ImportRefId = s.ImportRefId
       JOIN AppSecurity.Log l
         ON l.LogId = s.ImportRefId
       JOIN Sales.Prod p
         ON p.ProdId = s.ProdId
       JOIN Sales.Brand b
         ON b.BrandId = p.BrandId
WHERE  s.SMonth = @SMonth
       AND i.ImportStatId = 50
GROUP  BY CustNumber,
          SMonth
ORDER  BY [Customer] 
)
SELECT [Sales Month],
       [Customer],
       [BS],
       [FS],
       [FZ],
       TOTAL=[BS] + [FS] + [FZ]
FROM   CTE 

注意:如果Brand's的数量未知,则需要使用dynamic code

答案 1 :(得分:1)

我相信这就是你要找的东西:

/*
    Setup Sample Table
*/

declare @t table
    (
     [Sales Month] datetime,
     Customer nvarchar(6),
     Brand nvarchar(2),
     Qty tinyint
    )

/*
    Setup Sample Table with
*/

insert  into @t
        ([Sales Month], Customer, Brand, Qty)
values  ('2015-12-01', '030554', N'FS', 29),
        ('2015-12-01', '030554', N'BS', 5),
        ('2015-12-01', '032204', N'FZ', 21),
        ('2015-12-01', '032204', N'BS', 14),
        ('2015-12-01', '032204', N'FS', 114),
        ('2015-12-01', '034312', N'FZ', 8),
        ('2015-12-01', '034312', N'FS', 104),
        ('2015-12-01', '034312', N'BS', 16),
        ('2015-12-01', '034983', N'FS', 63),
        ('2015-12-01', '034983', N'BS', 18),
        ('2015-12-01', '034983', N'FZ', 3)

/*
    Generating desired output
*/

select  pvt.[Sales Month],
        pvt.Customer,
        isnull(pvt.BS, 0) as BS,
        isnull(pvt.FS, 0) as FS,
        isnull(pvt.FZ, 0) as FZ,
        isnull(pvt.BS, 0) + isnull(pvt.FS, 0) + isnull(pvt.FZ, 0) as Total
from    @t as t pivot
( sum(Qty) for Brand in (BS, FS, FZ) ) as pvt