2016-11-02 54 views
1

我有一個SQL語句可以獲得日常銷售額,但我希望總計這些行,可能使用CTE。將總行添加到SQL查詢的底部

我的代碼如下,我嘗試使用GROUPING和ROLLUP但無濟於事。任何幫助深表感謝!

DECLARE @StartDate NVARCHAR(MAX) = '20161101' 
DECLARE @FinishDate NVARCHAR(MAX) = '20161102' 

SELECT salesquery.Department, 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.Cost ELSE -salesquery.Cost END) AS 'Cost', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.[GP $] ELSE -salesquery.[GP $] END) AS 'GP $', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) AS 'TotalExGST', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) * 1.1 AS 'TotalInclGST', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.[GP $] ELSE -salesquery.[GP $] END)/SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) * 100 AS 'GP %' 

    FROM 
     (SELECT 
     iid.DepartmentCode AS 'Department', 
     ci.InvoiceDate, 
     ci.Type, 
     ci.InvoiceCode, 
     SUM(cid.ExtActualCost) AS 'Cost', 
     SUM(cid.ExtPrice) + MAX(ci.Freight) + MAX(ci.Other) AS 'TotalExGST', 
     (SUM(cid.ExtPrice) - SUM(cid.ExtActualCost)) AS 'GP $', 
     (CASE WHEN SUM(cid.ExtPrice) = 0 THEN 0 ELSE ((SUM(cid.ExtPrice) - SUM(cid.ExtActualCost))/SUM(cid.ExtPrice)) END) * 100 as 'GP %' 



     FROM CustomerInvoice ci 
     JOIN CustomerInvoiceDetail cid ON ci.InvoiceCode = cid.InvoiceCode 
     JOIN InventoryItemDepartment iid ON cid.ItemCode = iid.ItemCode 

     WHERE ci.IsVoided = 0 
     AND ci.InvoiceDate BETWEEN @StartDate AND @FinishDate 
     GROUP BY ci.invoicecode, iid.DepartmentCode, ci.Type, ci.InvoiceDate) salesquery 

    GROUP BY salesquery.Department 

這讓我像這樣

╔════════════╦══════════════╦══════════════╦══════════════╦════════════════╦═══════════╗ 
║ Department ║ Cost   ║ GP $   ║ Total Ex GST ║ Total Incl GST ║ GP %  ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬═══════════╣ 
║ EP   ║ 4720.262000 ║ 8076.918000 ║ 13179.180000 ║ 14497.098000 ║ 61.285400 ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬═══════════╣ 
║ F   ║ 11307.420000 ║ 11465.690000 ║.110000 ║ 25531.121000 ║ 49.399500 ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬═══════════╣ 
║ M   ║ 85.860000 ║ 45.310000 ║ 131.170000 ║ 144.287000  ║ 34.542900 ║ 
╚════════════╩══════════════╩══════════════╩══════════════╩════════════════╩═══════════╝ 

我想表與錶行「總計」中,增加了上述行,而平均的最後一列輸出採樣輸出。

╔════════════╦══════════════╦══════════════╦══════════════╦════════════════╦════════════╗ 
║ Department ║ Cost   ║ GP $   ║ Total Ex GST ║ Total Incl GST ║ GP %  ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬════════════╣ 
║ EP   ║ 4720.262000 ║ 8076.918000 ║ 13179.180000 ║ 14497.098000 ║ 61.285400 ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬════════════╣ 
║ F   ║ 11307.420000 ║ 11465.690000 ║.110000 ║ 25531.121000 ║ 49.399500 ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬════════════╣ 
║ M   ║ 85.860000 ║ 45.310000 ║ 131.170000 ║ 144.287000  ║ 34.542900 ║ 
╠════════════╬══════════════╬══════════════╬══════════════╬════════════════╬════════════╣ 
║ Total  ║ 11612.23  ║ 19587.70  ║ etc   ║ etc   ║ AVG(Above) ║ 
╚════════════╩══════════════╩══════════════╩══════════════╩════════════════╩════════════╝ 
+0

正如jdl134679所暗示的,這聽起來像應用程序應該處理的事情,作爲顯示數據的問題。在格式化顯示行而不是讓數據庫處理查詢兩次時,應該很容易高效地總計值。 – HABO

+0

好桌子!這個怎麼做? :) –

+1

@VadimLoboda http://www.tablesgenerator.com/text_tables :) –

回答

1

我傾向於使用GROUPING SETS。在過去的GROUP BY

GROUP BY GROUPING SETS ((salesquery.Department),()) 

可以使用懶人法(COALESCE(salesquery.Department, 'Total') as Department)或正確的方法(使用GROUPING())改變Department

0

您可以使用聯盟和美國通過salesquery.Department revome組選擇

SELECT salesquery.Department, 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.Cost ELSE -salesquery.Cost END) AS 'Cost', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.[GP $] ELSE -salesquery.[GP $] END) AS 'GP $', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) AS 'TotalExGST', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) * 1.1 AS 'TotalInclGST', 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.[GP $] ELSE -salesquery.[GP $] END)/SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) * 100 AS 'GP %' 

    FROM 
     (SELECT 
     iid.DepartmentCode AS 'Department', 
     ci.InvoiceDate, 
     ci.Type, 
     ci.InvoiceCode, 
     SUM(cid.ExtActualCost) AS 'Cost', 
     SUM(cid.ExtPrice) + MAX(ci.Freight) + MAX(ci.Other) AS 'TotalExGST', 
     (SUM(cid.ExtPrice) - SUM(cid.ExtActualCost)) AS 'GP $', 
     (CASE WHEN SUM(cid.ExtPrice) = 0 THEN 0 ELSE ((SUM(cid.ExtPrice) - SUM(cid.ExtActualCost))/SUM(cid.ExtPrice)) END) * 100 as 'GP %' 



     FROM CustomerInvoice ci 
     JOIN CustomerInvoiceDetail cid ON ci.InvoiceCode = cid.InvoiceCode 
     JOIN InventoryItemDepartment iid ON cid.ItemCode = iid.ItemCode 

     WHERE ci.IsVoided = 0 
     AND ci.InvoiceDate BETWEEN @StartDate AND @FinishDate 
     GROUP BY ci.invoicecode, iid.DepartmentCode, ci.Type, ci.InvoiceDate) salesquery 

    GROUP BY salesquery.Department 

    UNION 


SELECT 'Total , 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.Cost ELSE -salesquery.Cost END) , 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.[GP $] ELSE -salesquery.[GP $] END) , 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) , 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) * 1.1 , 
    SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.[GP $] ELSE -salesquery.[GP $] END)/SUM(CASE WHEN salesquery.Type = 'Invoice' THEN salesquery.TotalExGST ELSE -salesquery.TotalExGST END) * 100 

    FROM 
     (SELECT 
     iid.DepartmentCode AS 'Department', 
     ci.InvoiceDate, 
     ci.Type, 
     ci.InvoiceCode, 
     SUM(cid.ExtActualCost) AS 'Cost', 
     SUM(cid.ExtPrice) + MAX(ci.Freight) + MAX(ci.Other) AS 'TotalExGST', 
     (SUM(cid.ExtPrice) - SUM(cid.ExtActualCost)) AS 'GP $', 
     (CASE WHEN SUM(cid.ExtPrice) = 0 THEN 0 ELSE ((SUM(cid.ExtPrice) - SUM(cid.ExtActualCost))/SUM(cid.ExtPrice)) END) * 100 as 'GP %' 



     FROM CustomerInvoice ci 
     JOIN CustomerInvoiceDetail cid ON ci.InvoiceCode = cid.InvoiceCode 
     JOIN InventoryItemDepartment iid ON cid.ItemCode = iid.ItemCode 

     WHERE ci.IsVoided = 0 
     AND ci.InvoiceDate BETWEEN @StartDate AND @FinishDate 
     GROUP BY ci.invoicecode, iid.DepartmentCode, ci.Type, ci.InvoiceDate) salesquery 
1

使用UNION在結束時重新和你原來的查詢,並追加它......像這樣(作爲概念):

DECLARE @StartDate NVARCHAR(MAX) = '20161101' 
DECLARE @FinishDate NVARCHAR(MAX) = '20161102' 

SELECT a.* 
FROM (

    -- Your original query here 

) AS a 

UNION 

SELECT SUM(b.This), SUM(b.That) FROM (

    -- Your original query here 

) AS b 

有可能是一個更好的方法來做到這一點,但這將工作。不管如何,你需要重新查詢原始無論如何設置(或使用光標去RBAR,但是這會是更糟糕)

我傾向於說,使用任何UI顯示總結原有結果(不包括它在查詢中)可能是更標準的方法。

+0

你是不是指'SELECT SUM(a.This),SUM(a.That)'??? –

+0

是的,是的,我做了:)(實際上,我沒有想到這一點,但肯定,它可能工作) – jleach