[英]sql query select sum() of column from multiple tables group by date
所以我有4個表,我只想得到每個表的每一列的總和,並按日期分組,這樣我就可以有適當的數量。 例如:
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 |
如果你想在table1中根據'for value'得到SUM()結果,請使用下面的腳本。
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
這適用於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
使用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
我的解決方案如下
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
輸出將為
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.