2016-02-19 109 views
0

这是我的查询。我得到的结果是正确的,但我无法按照所需的格式获取结果。我试过使用Pivot,但是我得到错误。有任何想法吗?如何格式化SQL查询?使用枢轴?

查询:

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 

回答

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

+0

非常感谢你@ VR46!像魅力一样工作。当我的声望达到15时,我将能够给予积分。我会确保我绕回来! – ADubb

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 
+0

谢谢您的回答。我不确定它正在寻找什么,或者我错过了一些东西。我发布的查询是用来从现有表中提取数据的查询。我需要从提供的查询格式化它。我将如何将查询与您提供的示例相结合?我是否嵌套选择语句?如果是这样,我尝试了这一点,并得到错误。你能帮忙吗? – ADubb

+2

@ADubb - 您需要用您选择的查询'..from(选择SMonth'Sales Month'..'')替换'..txt'作为t..'。或者如果你想改变你现有的查询,请检查我的答案 –

+2

谢谢VR46的澄清,并感谢你的答案拉尔夫!两人都工作! – ADubb