2016-09-05 3 views
1

Итак, у меня есть 4 таблицы, и я просто хочу иметь сумму каждого столбца каждой таблицы и группировать по дате, чтобы я мог иметь нужную сумму. например:sql query select sum() столбца из нескольких таблиц по дате

Table 1 
ID|Amount1|Amount2| forDate | 
1 | 12 | 14 |2016-09-05| 
2 | 13 | 15 |2016-09-05| 

Table 2 
ID|Amount3|Amount4|Amount5| forDate | 
1 | 15 | 16 | 17 |2016-09-05| 

Table 3 
ID|Amount6| forDate | 
1 | 16 |2016-09-05| 
2 | 17 |2016-09-05| 


Table 4 
ID|Amount7| forDate | 
1 | 18 |2016-09-05| 

Я не могу понять, как это сделать, как этот.

| Date |Amount1|Amount2|Amount3|Amount4|Amount5|Amount6|Amount7| 
|2016-09-05| 25 | 29 | 15 | 16 | 17 | 33 | 18 | 

общая сумма должна быть по дате. Помоги пожалуйста.

Дополнительно: Я хочу также иметь предложение Where. Я попытался @Unnikrishnan R ответа, но он дал мне этот выход:

| Date |Amount1|Amount2|Amount3|Amount4|Amount5|Amount6|Amount7| 
|2016-09-05| 25 | 29 | 30 | 32 | 34 | 33 | 36 | 

ответ

0

Если вы хотите года получить результат SUM() на основе «для значения» в table1 использовать ниже сценарий.

SELECT t1.ForDate, SUM(DISTINCT ISNULL(AMOUNT1,0)) AMOUNT1 ,SUM(DISTINCT ISNULL(Amount2,0)) AMOUNT2,SUM(DISTINCT ISNULL(AMOUNT3,0)) AMOUNT3 
     ,SUM(DISTINCT ISNULL(Amount4,0)) AMOUNT4,SUM(DISTINCT ISNULL(AMOUNT5,0)) AMOUNT5,SUM(DISTINCT ISNULL(Amount6,0)) AMOUNT6,SUM(DISTINCT ISNULL(Amount7,0)) AMOUNT7 
FROM table1 t1 
LEFT JOIN table2 t2 on t1.fordate=t2.fordate 
LEFT JOIN table3 t3 on t1.fordate=t3.fordate 
LEFT JOIN table4 t4 on t1.fordate=t4.fordate 
GROUP BY t1.forDate 

Если вы хотите включить «fordate» от всего стола и нужен совокупный SUM(), используйте следующий сценарий.

with cte_1 
as 
(SELECT ForDate, SUM(AMOUNT1) AMOUNT1 ,SUM(Amount2) AMOUNT2,0 AMOUNT3 
     ,0 AMOUNT4,0 AMOUNT5,0 AMOUNT6,0 AMOUNT7 
FROM table1 
GROUP BY forDate 

UNION ALL 

SELECT ForDate, 0 AMOUNT1 ,0 AMOUNT2,SUM(AMOUNT3) AMOUNT3 
     ,SUM(Amount4) AMOUNT4,SUM(AMOUNT5) AMOUNT5,0 AMOUNT6,0 AMOUNT7 
FROM table2 
GROUP BY forDate 


UNION ALL 


SELECT ForDate, 0 AMOUNT1 ,0 AMOUNT2,0 AMOUNT3 
     ,0 AMOUNT4,0 AMOUNT5,SUM(Amount6) AMOUNT6,0 AMOUNT7 
FROM table3 
GROUP BY forDate 

UNION ALL 

SELECT ForDate, 0 AMOUNT1 ,0 AMOUNT2,0 AMOUNT3 
     ,0 AMOUNT4,0 AMOUNT5,0 AMOUNT6,SUM(Amount7) AMOUNT7 
FROM table4 
GROUP BY forDate) 

SELECT forDate,SUM(AMOUNT1) AMOUNT1 ,SUM(Amount2) AMOUNT2,SUM(AMOUNT3) AMOUNT3 
     ,SUM(Amount4) AMOUNT4,SUM(AMOUNT5) AMOUNT5,SUM(Amount6) AMOUNT6,SUM(Amount7) AMOUNT7 
FROM cte_1 
GROUP BY cte_1 
0

Это работает на SQL Server:

CREATE TABLE T1 (ID int, Amount1 int, Amount2 int, forDate date); 
CREATE TABLE T2 (ID int, Amount3 int, Amount4 int, Amount5 int, forDate date); 
CREATE TABLE T3 (ID int, Amount6 int, forDate date); 
CREATE TABLE T4 (ID int, Amount7 int, forDate date); 

INSERT INTO T1 VALUES (1, 12, 14, '2016-09-05'); 
INSERT INTO T1 VALUES (2, 13, 15, '2016-09-05'); 
INSERT INTO T2 VALUES (1, 15, 16, 17, '2016-09-05'); 
INSERT INTO T3 VALUES (1, 16, '2016-09-05'); 
INSERT INTO T3 VALUES (2, 17, '2016-09-05'); 
INSERT INTO T4 VALUES (1, 18, '2016-09-05'); 

WITH 
TA AS 
    (SELECT forDate, SUM(Amount1) AS Amount1, SUM(Amount2) AS Amount2 
    FROM T1 
    GROUP BY forDate 
    ), 
TB AS 
    (SELECT forDate, SUM(Amount3) AS Amount3, SUM(Amount4) AS Amount4, SUM(Amount5) AS Amount5 
    FROM T2 
    GROUP BY forDate 
    ), 
TC AS 
    (SELECT forDate, SUM(Amount6) AS Amount6 
    FROM T3 
    GROUP BY forDate 
    ), 
TD AS 
    (SELECT forDate, SUM(Amount7) AS Amount7 
    FROM T4 
    GROUP BY forDate 
    ) 
SELECT TB.forDate, TA.Amount1, TA.Amount2, TB.Amount3, TB.Amount4, TB.Amount5, TC.Amount6, TD.Amount7 
FROM TA, TB, TC, TD 
WHERE TA.forDate = TB.forDate 
    AND TB.forDate = TC.forDate 
    AND TC.forDate = TD.forDate 
0

Использование UNION ALL, а затем GROUP BY:

CREATE TABLE #tbl1 (ID int, Amount1 int, Amount2 int, forDate date); 
CREATE TABLE #tbl2 (ID int, Amount3 int, Amount4 int, Amount5 int, forDate date); 
CREATE TABLE #tbl3 (ID int, Amount6 int, forDate date); 
CREATE TABLE #tbl4 (ID int, Amount7 int, forDate date); 

INSERT INTO #tbl1 VALUES (1, 12, 14, '2016-09-05'); 
INSERT INTO #tbl1 VALUES (2, 13, 15, '2016-09-05'); 
INSERT INTO #tbl2 VALUES (1, 15, 16, 17, '2016-09-05'); 
INSERT INTO #tbl3 VALUES (1, 16, '2016-09-05'); 
INSERT INTO #tbl3 VALUES (2, 17, '2016-09-05'); 
INSERT INTO #tbl4 VALUES (1, 18, '2016-09-05'); 

SELECT 
    X.forDate, 
    SUM(Amount1) AS Amount1, 
    SUM(Amount2) AS Amount2, 
    SUM(Amount3) AS Amount3, 
    SUM(Amount4) AS Amount4, 
    SUM(Amount5) AS Amount5, 
    SUM(Amount6) AS Amount6, 
    SUM(Amount7) AS Amount7 
FROM 
(
    SELECT 
     forDate, 
     ISNULL(Amount1,0) AS Amount1, 
     ISNULL(Amount2,0) AS Amount2, 
     0 AS Amount3, 
     0 AS Amount4, 
     0 AS Amount5, 
     0 AS Amount6, 
     0 AS Amount7 
    FROM #tbl1 
    UNION ALL 
    SELECT 
     forDate, 
     0 AS Amount1, 
     0 AS Amount2, 
     ISNULL(Amount3,0) AS Amount3, 
     ISNULL(Amount4,0) AS Amount4, 
     ISNULL(Amount5,0) AS Amount5, 
     0 AS Amount6, 
     0 AS Amount7 
    FROM #tbl2 
    UNION ALL 
    SELECT 
     forDate, 
     0 AS Amount1, 
     0 AS Amount2, 
     0 AS Amount3, 
     0 AS Amount4, 
     0 AS Amount5, 
     ISNULL(Amount6,0) AS Amount6, 
     0 AS Amount7 
    FROM #tbl3 
    UNION ALL 
    SELECT 
     forDate, 
     0 AS Amount1, 
     0 AS Amount2, 
     0 AS Amount3, 
     0 AS Amount4, 
     0 AS Amount5, 
     0 AS Amount6, 
     ISNULL(Amount7,0) AS Amount7 
    FROM #tbl4 
)X 
GROUP By X.forDate 

Drop table #tbl1,#tbl2,#tbl3,#tbl4 
0

Мое решение заключается в следующем

select 
    forDate, 
    SUM(Amount1) Amount1, SUM(Amount2) Amount2, SUM(Amount3) Amount3, SUM(Amount4) Amount4, SUM(Amount5) Amount5, SUM(Amount6) Amount6, SUM(Amount7) Amount7 
from (
select forDate, SUM(Amount1) Amount1, SUM(Amount2) Amount2, null Amount3, null Amount4, null Amount5, null Amount6, null Amount7 from Table1 Group By forDate 
union all 
select forDate, null, null, SUM(Amount3) Amount3, SUM(Amount4) Amount4, SUM(Amount5) Amount5, null, null from Table2 Group By forDate 
union all 
select forDate, null, null, null, null, null, SUM(Amount6) Amount6, null from Table3 Group By forDate 
union all 
select forDate, null, null, null, null, null, null, SUM(Amount7) Amount7 from Table4 Group By forDate 
) alldata 
group by forDate 

выход будет как

enter image description here

Смежные вопросы