2017-02-12 45 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

应按日历日期进行分组,而不是发票日期 –