UNIVIVOT запрос, который использует FULL OUTER JOIN и SUM - PullRequest
0 голосов
/ 09 января 2020

У меня есть таблицы «Счета» и «Доходы», и я пытаюсь объединить и затем отключить их.

Вот значения в каждой таблице:

Доход:

enter image description here

Счета:

enter image description here

I мы получили все, что суммировали, и вычислили разницу с помощью следующего оператора sql:

SELECT        SUM(Income_tbl.Income) AS Income, SUM(Accounts_tbl.Amount) AS Debt, SUM(Income_tbl.Income) - SUM(Accounts_tbl.Amount) AS difference
FROM            Accounts_tbl
FULL OUTER JOIN Income_tbl
ON Accounts_tbl.id = Income_tbl.id

, и вот результат:

enter image description here

Что я хочу сделать, это отключить это, добавив столбец «type», который будет содержать поля «Доход», «Долг» и «Разница» и столбец «AMT», который содержит суммы.

вот как то так:

enter image description here

Спасибо всем!

Ответы [ 3 ]

2 голосов
/ 09 января 2020

Как насчет простого union all?

select 'income' type, sum(income) amt from income_tbl
union all select 'debt', sum(amount) from accounts_tbl
union all select 
    'difference', 
    (select sum(income) from income_tbl) - (select sum(amount) from accounts_tbl)

Возможно, SQL Сервер оптимизирует запрос, выполняя каждый подзапрос только один раз. В противном случае вы все равно можете использовать cte:

with cte as (
select 'income' type, sum(income) amt from income_tbl
union all select 'debt', sum(amount) from accounts_tbl
)
select * from cte
union all select 
    'difference', 
    sum(case when type = 'income' then amt else -amt end) 
from cte
2 голосов
/ 09 января 2020

Я не знаю, что full outer join подходит для этого, но что это не ваш вопрос. Но просто используйте подзапрос:

SELECT v.*
FROM (SELECT SUM(i.Income) AS Income, 
             SUM(a.Amount) AS Debt, 
             SUM(i.Income) - SUM(a.Amount) AS difference
      FROM Accounts_tbl a FULL OUTER JOIN
           Income_tbl i
           ON a.id = i.id
     ) ai CROSS APPLY
     (VALUES ('Income', Income), ('Debt', Debt), ('Difference', difference)
     ) v(type, amt);

Вероятно, гораздо эффективнее это сделать:

with ai as (
      select 'income' as type, sum(income) as amt
      from income_tbl
      union all
      select 'debt', sum(amount) as amt
      from accounts_tbl
     )
select ai.*
from ai
union all
select 'difference',
       sum(case when type = 'income' then amt else - amt end)
from ai;
1 голос
/ 09 января 2020
SELECT col1 as [type],col2 as [amt] FROM
(
SELECT  SUM(Income_tbl.Income) AS Income,
SUM(Accounts_tbl.Amount) AS Debt,
SUM(Income_tbl.Income) - SUM(Accounts_tbl.Amount) AS difference
FROM  Accounts_tbl
FULL OUTER JOIN Income_tbl ON Accounts_tbl.id = Income_tbl.id
) stu
UNPIVOT
(col1 FOR col2 IN ([Income],[Debt],[difference])
) AS tbl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...