1

Income( InvoiceDate, TotalAmount) とOutcome( ) の2 つのテーブルがありExpenseDate, TotalAmountます。

以下のように、各列のデータがあるとします。

Income:

| INVOICEDATE | TOTALAMOUNT |
|-------------|-------------|
|  2013-10-16 |       22000 |
|  2013-10-17 |       14400 |
|  2013-10-18 |        4488 |

Outcome:

| EXPENSEDATE | TOTALAMOUNT |
|-------------|-------------|
|  2013-10-25 |          15 |

これら2つのテーブルをマージして、以下のように表示したい:

|       DATE | INCOME | OUTCOME |
|------------|--------|---------|
| 2013-10-25 |      0 |      15 |
| 2013-10-16 |  22000 |       0 |
| 2013-10-17 |  14400 |       0 |
| 2013-10-18 |   4488 |       0 |

ただし、T-SQL を実行すると、代わりに次のように表示されます。

|       DATE | INCOME | OUTCOME |
|------------|--------|---------|
|     (null) | (null) |      15 |
| 2013-10-16 |  22000 |  (null) |
| 2013-10-17 |  14400 |  (null) |
| 2013-10-18 |   4488 |  (null) |

これは私のT-SQLです:

SELECT
    CASE (income.InvoiceDate)
       WHEN NULL THEN Outcome.expenseDate
       ELSE income.InvoiceDate
    END AS [Date],
    CASE (income.TotalAmount)
       WHEN NULL THEN 0
       ELSE income.TotalAmount
    END AS Income,
    CASE (Outcome.TotalAmount)
        WHEN NULL THEN 0
        ELSE Outcome.TotalAmount
    END AS Outcome
FROM
    Outcome
FULL OUTER JOIN 
    income ON Outcome.expenseDate = income.InvoiceDate
WHERE
    NOT (
        Outcome.TotalAmount = 0
        AND income.TotalAmount = 0
    )

この SQL はhttp://sqlfiddle.com/#!6/3589f/1でテストできます。

私のT-SQLの何が問題なのか誰か知っていますか?

ありがとう!ペンガン

4

2 に答える 2

0

union代わりに

select InvoiceDate as Date, TotalAmount as Income, 0 as Outcome from Income
union all
select ExpenseDate, 0, TotalAmount from Outcome

同じ日付の収入と支出ができる場合は、これからグループ化できます。

select [date], Sum(Income), Sum(outcome) from
(
    select InvoiceDate as Date, TotalAmount as Income, 0 as Outcome from Income
    union all
    select ExpenseDate, 0, TotalAmount from Outcome
) v
group by [date]

あなたの声明のどこが間違っているかについては、問題はcase. 彼らはis nullむしろ使用する必要がありますwhen null

CASE WHEN income.TotalAmount IS NULL THEN 0 ELSE income.TotalAmount end,

しかし、より短い方法は使用することですISNULL

ISNULL(income.TotalAmount, 0)
于 2013-10-19T17:24:58.400 に答える
0

CASEステートメントは、一連の演算子の省略形です=。ただし、NULLはどの値とも等しくないため (これが演算IS子の目的です)、 sCASEを評価するために使用することNULLはやや無意味です。

COALESCE代わりに、関数をyse してNULL、次のように s を 0に置き換えることができます。

SELECT Outcome.expenseDate AS [Date],
       COALESCE(Income.TotalAMount, 0) AS Income,
       COALESCE(Outcome.TotalAMount, 0) AS Outcome
FROM   Outcome
FULL OUTER JOIN income ON Outcome.expenseDate = income.InvoiceDate
WHERE   NOT (
    Outcome.TotalAmount = 0
    AND income.TotalAmount = 0
)
于 2013-10-19T17:25:50.130 に答える