2017-02-12 15 views
1

私はある月の財務データをSQLから引き出しています。毎月のデータとその横の数値を取得したいと考えています。数字がnullになる日もあります。そのため、日付のグループを使用してクエリを実行すると、データを含む行のみが返されます。データがNULLであっても、日付による財務データグループ

私はそう

╔════════════╦═════════════╗ 
║ 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 ║    ║ 
╚════════════╩═════════════╝ 

私は月のすべての日を選択することになるクエリを記述するために管理が、私はこれが私に参加するために得ることができなかったようなデータを返すために探しています

╔════════════╦═════════════╗ 
║ 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 ║ 
╚════════════╩═════════════╝ 

財務クエリですか?

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あなたは財務表への参加を残していますか? hehe – 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を作成した後は、すべての日付とカレンダーと呼ばれる、あなたはLEFTが CustomerInvoiceテーブルとJOINを行う必要があります。 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

請求書日付ではなく、暦日にグループ化する必要があります。 –

関連する問題