2016-02-19 107 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