2017-02-12 22 views
1

我從一個給定月份的SQL中提取財務數據,並且想要獲取每月的每一天的數據集以及它旁邊的數字。有些日子,數字將爲空,這就是爲什麼如果我在日期上使用組執行查詢,它將只返回包含數據的行。財務數據分組按日期排列,即使數據爲空

╔════════════╦═════════════╗ 
║ Date  ║ DailyActual ║ 
╠════════════╬═════════════╣ 
║ 1/02/2017 ║ 14397.59091 ║ 
╠════════════╬═════════════╣ 
║ 2/02/2017 ║ 29723.37273 ║ 
╠════════════╬═════════════╣ 
║ 3/02/2017 ║ 32436.31818 ║ 
╠════════════╬═════════════╣ 
║ 6/02/2017 ║ 27048.32727 ║ 
╠════════════╬═════════════╣ 
║ 7/02/2017 ║ 30690.66364 ║ 
╠════════════╬═════════════╣ 
║ 8/02/2017 ║ 32267.42727 ║ 
╠════════════╬═════════════╣ 
║ 9/02/2017 ║ 29592.29091 ║ 
╠════════════╬═════════════╣ 
║ 10/02/2017 ║ 31740.49091 ║ 
╚════════════╩═════════════╝ 

我期待像返回的數據,以便

╔════════════╦═════════════╗ 
║ Date  ║ DailyActual ║ 
╠════════════╬═════════════╣ 
║ 1/02/2017 ║ 14397.59091 ║ 
╠════════════╬═════════════╣ 
║ 2/02/2017 ║ 29723.37273 ║ 
╠════════════╬═════════════╣ 
║ 3/02/2017 ║ 32436.31818 ║ 
╠════════════╬═════════════╣ 
║ 4/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 5/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 6/02/2017 ║ 27048.32727 ║ 
╠════════════╬═════════════╣ 
║ 7/02/2017 ║ 30690.66364 ║ 
╠════════════╬═════════════╣ 
║ 8/02/2017 ║ 32267.42727 ║ 
╠════════════╬═════════════╣ 
║ 9/02/2017 ║ 29592.29091 ║ 
╠════════════╬═════════════╣ 
║ 10/02/2017 ║ 31740.49091 ║ 
╠════════════╬═════════════╣ 
║ 11/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 12/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 13/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 14/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 15/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 16/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 17/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 18/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 19/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 20/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 21/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 22/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 23/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 24/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 25/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 26/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 27/02/2017 ║    ║ 
╠════════════╬═════════════╣ 
║ 28/02/2017 ║    ║ 
╚════════════╩═════════════╝ 

我設法編寫一個查詢,其將在本月選擇所有的日子,但我不能得到這個加入我的財務查詢?

DECLARE @startDate DATETIME= '20170201' 
DECLARE @endDate DATETIME = '20170228' 
;WITH Calender AS 
(
    SELECT @startDate AS CalanderDate 
    UNION ALL 
    SELECT CalanderDate + 1 FROM Calender 
    WHERE CalanderDate + 1 <= @endDate 
) 
SELECT CalanderDate 
FROM Calender 
OPTION (MAXRECURSION 0) 

我當前查詢按我的第一個表,如下所示

SELECT ci.InvoiceDate, SUM(CASE WHEN ci.Type = 'Invoice' THEN ci.Total ELSE -ci.Total END)/1.1 
    FROM CustomerInvoice ci 
    WHERE ci.IsVoided = 0 AND ci.InvoiceDate BETWEEN '20170201' AND '20170228' 
    GROUP BY ci.InvoiceDate 
+1

左連接到日曆表。這個問題在互聯網上已經回答了很多次。 – ATC

+1

@ATC你的意思是左加入財務表?嘿嘿 – Andomar

回答

1

你最好left join從日曆表,財務表。這將包括日曆表中的所有行,可選地對財務表中的任何行重複。例如:

DECLARE @startDate DATETIME= '20170201' 
DECLARE @endDate DATETIME = '20170228' 
; 
WITH Calendar AS 
     (
     SELECT @startDate AS CalendarDate 
     UNION ALL 
     SELECT CalendarDate + 1 FROM Calendar 
     WHERE CalendarDate + 1 <= @endDate 
     ) 
SELECT CalendarDate,  
     SUM(CASE WHEN ci.Type = 'Invoice' THEN ci.Total ELSE -ci.Total END)/1.1 
FROM Calendar 
LEFT JOIN 
     CustomerInvoice ci 
ON  ci.InvoiceDate = CalendarDate 
     and ci.IsVoided = 0 
GROUP BY 
     CalendarDate 
OPTION (MAXRECURSION 0) 
+0

謝謝......很明顯,真的! –

+0

@BrendanGooden:在ci.InvoiceDate上分組很好,不會起作用! – Andomar

1

您已經創建後,CTE稱爲日曆與所有的日期,你需要做一個留下 CustomerInvoice表連接。不要忘記在CASE語句中添加一個額外的條件。由於此LEFT JOIN將填充所有不匹配的(按日期) ci.type以NULL值。

SELECT c.CalanderDate AS Date 
     , SUM(CASE WHEN ci.Type IS NULL THEN 0 
        WHEN ci.Type = 'Invoice' THEN ci.Total 
        ELSE - ci.Total END 
      )/1.1 AS DailyActual 
    FROM Calender AS c 
LEFT JOIN CustomerInvoice ci ON c.CalanderDate = ci.InvoiceDate 
          AND ci.IsVoided = 0 
GROUP BY c.CalanderDate 
+0

這不起作用?仍然只顯示包含CustomerInvoice數據的行 –

+0

應該在JOIN或WHERE處完成過濾。檢查和工作。 –

+0

應按日曆日期進行分組,而不是發票日期 –