SQL连接3个格式相同的表
需要帮助获取每个日期的总Val! 我目前有3个表,每个表以相同的格式存储相同类型的数据 我需要在一张桌子上找到每个日期的ValSQL连接3个格式相同的表,sql,join,Sql,Join,需要帮助获取每个日期的总Val! 我目前有3个表,每个表以相同的格式存储相同类型的数据 我需要在一张桌子上找到每个日期的Val CREATE TABLE table1(Date DATE, Val INTEGER); CREATE TABLE table2(Date DATE, Val INTEGER); CREATE TABLE table3(Date DATE, Val INTEGER); INSERT INTO table1 values('2013-01-01', 4); INSERT
CREATE TABLE table1(Date DATE, Val INTEGER);
CREATE TABLE table2(Date DATE, Val INTEGER);
CREATE TABLE table3(Date DATE, Val INTEGER);
INSERT INTO table1 values('2013-01-01', 4);
INSERT INTO table1 values('2013-01-02', 3);
INSERT INTO table1 values('2013-01-04', 2);
INSERT INTO table2 values('2013-01-01', 5);
INSERT INTO table2 values('2013-01-03', 4);
INSERT INTO table2 values('2013-01-04', 1);
INSERT INTO table3 values('2013-01-02', 3);
INSERT INTO table3 values('2013-01-03', 1);
INSERT INTO table3 values('2013-01-06', 8);
我试过:
SELECT table1.Date, table2.Date, table3.Date, ISNULL(table1.Val,0) + ISNULL(table2.Val,0) + ISNULL(table3.Val,0)
FROM table1
FULL JOIN table2
ON table1.Date = table2.Date
FULL JOIN table3
ON table1.Date = table3.Date
谢谢 您可以
将每个表中的所有值合并为一个派生表,然后从该表中求和(Val)
和分组:
SELECT Date, SUM(Val)
FROM (SELECT * FROM table1
UNION ALL
SELECT * FROM table2
UNION ALL
SELECT * FROM table3) v
GROUP BY Date
输出
Date SUM(Val)
2013-01-01 9
2013-01-02 6
2013-01-03 5
2013-01-04 3
2013-01-06 8
在这种情况下可以使用合并。我创建了一个名为newtable的新表,将数据合并到该表中,保留原始表不变。我将列名称Date更改为Dait
select * into newtable
from table1
merge newtable t1
using table2 t2
on t1.Dait = t2.Dait
when matched
then update set
t1.Val = t1.Val + t2.Val
when not matched
then insert (Dait, Val)
values(t2.Dait, t2.Val);
merge newtable t1
using table3 t3
on t1.Dait = t3.Dait
when matched
then update set
t1.Val = t1.Val + t3.Val
when not matched
then insert (Dait, Val)
values(t3.Dait, t3.Val);
如果您的表没有重复的日期,则完全联接应该可以工作:
SELECT COALESCE(table1.Date, table2.Date, table3.Date) as date,
COALESCE(table1.Val, 0) + COALESCE(table2.Val, 0) + COALESCE(table3.Val, 0)
FROM table1 FULL JOIN
table2
ON table1.Date = table2.Date FULL JOIN
table3
ON table1.Date = table3.Date;
在许多数据库中,您可以使用USING
子句稍微简化这一点:
SELECT date,
COALESCE(table1.Val, 0) + COALESCE(table2.Val, 0) + COALESCE(table3.Val, 0)
FROM table1 FULL JOIN
table2
USING (Date)
table3
USING (Date);
通常,完全联接
的性能要比联合所有
/分组方式
好。我确实发现后者更简单一些,因为您不必担心NULL
值