SQL 子查询连接和求和
SQL Subquery Join and Sum
我有 Table 1 和 2,两者都有共同的列名 ID。
Table 1 具有重复的行条目,我能够 trim 使用:
SELECT DISTINCT
Table 2 有重复的 ID 数字条目 (dollarspent),我需要并且能够总结:
Table 1 Table 2
------------ ------------------
ID spec ID Dol1 Dol2
54 A 54 1 0
54 A 54 2 1
55 B 55 0 2
56 C 55 3 0
-我需要将这两个查询合并为一个查询,以便得到 Table 1 & Table 2 ON 列 ID 的结果 JOIN,(a) Table 中没有重复项1 & (b) 来自 Table 2
的总 $ 值
例如:
NewTable
----------------------------------------
ID Spec Dol1 Dol2
54 A 3 1
55 B 3 2
注意:Table 1 和 2 中的行数不同。
谢谢
使用派生的 table 从 table1 获取不同的值,然后简单地连接到 table 2 并使用聚合。
您遇到的问题是 table1 和 table2 之间存在 M:M 关系。您需要它是 1:M 才能使总和准确。因此,我们通过使用 select distinct 从 table1 派生 t1 来为我们提供 1:M 关系中的唯一记录(假设每个 ID 的规格相同)
SELECT T1.ID, T1.Spec, Sum(T2.Dol1) as Dol1, sum(T2.Dol2) as Dol2
FROM (SELECT distinct ID, spec
FROM table1) T1
INNER JOIN table2 T2
on t2.ID = T1.ID
GROUP BY T1.ID, T1.Spec
这确实假设您只需要同时存在于两者中的记录。否则我们可能需要使用(LEFT、RIGHT 或 FULL)外连接;取决于期望的结果。
我真的看不到你的数据,但你可能想试试:
SELECT DISTINCT ID
FROM TblOne
UNION ALL
SELECT DISTINCT ID, SUM(Dol)
FROM TblTwo
GROUP BY ID
Pre-aggregate table 2 然后加入:
select t1.id, t1.spec, t2.dol1, t2.dol2
from (select t2.id, sum(dol1) as dol1, sum(dol2) as dol2
from table2 t2
group by t2.id
) t2 join
(select distinct t1.id, t1.spec
from table1 t1
) t1
on t1.id = t2.id;
对于您的数据示例,您不需要 pre-aggregate table 2. 如果 table1
有多个规格,这会给出正确的总和 - 尽管在多行中对于给定的 ID。
我有 Table 1 和 2,两者都有共同的列名 ID。
Table 1 具有重复的行条目,我能够 trim 使用:
SELECT DISTINCT
Table 2 有重复的 ID 数字条目 (dollarspent),我需要并且能够总结:
Table 1 Table 2
------------ ------------------
ID spec ID Dol1 Dol2
54 A 54 1 0
54 A 54 2 1
55 B 55 0 2
56 C 55 3 0
-我需要将这两个查询合并为一个查询,以便得到 Table 1 & Table 2 ON 列 ID 的结果 JOIN,(a) Table 中没有重复项1 & (b) 来自 Table 2
的总 $ 值例如:
NewTable
----------------------------------------
ID Spec Dol1 Dol2
54 A 3 1
55 B 3 2
注意:Table 1 和 2 中的行数不同。
谢谢
使用派生的 table 从 table1 获取不同的值,然后简单地连接到 table 2 并使用聚合。
您遇到的问题是 table1 和 table2 之间存在 M:M 关系。您需要它是 1:M 才能使总和准确。因此,我们通过使用 select distinct 从 table1 派生 t1 来为我们提供 1:M 关系中的唯一记录(假设每个 ID 的规格相同)
SELECT T1.ID, T1.Spec, Sum(T2.Dol1) as Dol1, sum(T2.Dol2) as Dol2
FROM (SELECT distinct ID, spec
FROM table1) T1
INNER JOIN table2 T2
on t2.ID = T1.ID
GROUP BY T1.ID, T1.Spec
这确实假设您只需要同时存在于两者中的记录。否则我们可能需要使用(LEFT、RIGHT 或 FULL)外连接;取决于期望的结果。
我真的看不到你的数据,但你可能想试试:
SELECT DISTINCT ID
FROM TblOne
UNION ALL
SELECT DISTINCT ID, SUM(Dol)
FROM TblTwo
GROUP BY ID
Pre-aggregate table 2 然后加入:
select t1.id, t1.spec, t2.dol1, t2.dol2
from (select t2.id, sum(dol1) as dol1, sum(dol2) as dol2
from table2 t2
group by t2.id
) t2 join
(select distinct t1.id, t1.spec
from table1 t1
) t1
on t1.id = t2.id;
对于您的数据示例,您不需要 pre-aggregate table 2. 如果 table1
有多个规格,这会给出正确的总和 - 尽管在多行中对于给定的 ID。