bry*_*val 29 sql t-sql sql-server sql-server-2005 full-outer-join
我有多个外连接
SELECT A.column2
, B.column2
, C.column2
FROM
(
(SELECT month, column2 FROM table1) A
FULL OUTER JOIN
(SELECT month, column2 FROM table2) B on A.month= B.month
FULL OUTER JOIN
(SELECT month, column2 FROM table3) C on A.month= C.month
)
Run Code Online (Sandbox Code Playgroud)
现在最后一次加入有一个问题,它在A的月份超过B时重复,但是如果B有更多的月份A我们在C中有OUTER JOIN,而A现在重复,所以我想有一个完整的外部加入两个表可能会解决问题?任何深入的链接?
示例数据(不正确)
??????????????????????????????????????
? Revenue ? Budget ? ActualMonth ?
??????????????????????????????????????
? 6.9172 ? 3.5046 ? Jan ?
? 7.3273 ? 3.7383 ? Feb ?
? 7.3273 ? 3.9719 ? Mar ?
? 7.2726 ? 4.2056 ? Apr ?
? 7.2595 ? 6.7757 ? May ?
? 7.2726 ? 6.7757 ? Jun ?
? 0.41 ? 0.00 ? Jul ?
? 0.41 ? 0.00 ? Aug ?
? 0.41 ? 0.00 ? Sep ?
? 0.41 ? 0.00 ? Oct ?
? 7.4696 ? 0.00 ? Nov ?
? 7.4696 ? 0.00 ? Dec ?
? 0.00 ? 9.3457 ? Sep ?
? 0.00 ? 16.3551 ? Dec ?
? 0.00 ? 6.3084 ? Jul ?
? 0.00 ? 14.0186 ? Oct ?
? 0.00 ? 16.3551 ? Nov ?
? 0.00 ? 6.1915 ? Aug ?
??????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
正确的数据
??????????????????????????????????????
? Revenue ? Budget ? ActualMonth ?
??????????????????????????????????????
? 6.9172 ? 3.5046 ? Jan ?
? 7.3273 ? 3.7383 ? Feb ?
? 7.3273 ? 3.9719 ? Mar ?
? 7.2726 ? 4.2056 ? Apr ?
? 7.2595 ? 6.7757 ? May ?
? 7.2726 ? 6.7757 ? Jun ?
? 0.41 ? 6.3084 ? Jul ?
? 0.41 ? 6.1915 ? Aug ?
? 0.41 ? 9.3457 ? Sep ?
? 0.41 ? 14.0186 ? Oct ?
? 7.4696 ? 16.3551 ? Nov ?
? 7.4696 ? 16.3551 ? Dec ?
??????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
Ser*_*rge 37
SELECT A.column2
, B.column2
, C.column2
FROM
(
(SELECT month, column2 FROM table1) A
FULL OUTER JOIN
(SELECT month, column2 FROM table2) B on A.month= B.month
FULL OUTER JOIN
(SELECT month, column2 FROM table3) C on ISNULL(A.month, B.month) = C.month
)
Run Code Online (Sandbox Code Playgroud)
其中一种方法是从所有三个表中的所有可能数据创建"锚"表,然后使用left outer join:
select
A.column2,
B.column2,
C.column2
from (
select distinct month from table1
union
select distinct month from table2
union
select distinct month from table3
) as X
left outer join table1 as A on A.month = X.month
left outer join table2 as B on B.month = X.month
left outer join table3 as C on C.month = X.month
Run Code Online (Sandbox Code Playgroud)
我可以立即想到两种方法来解决这个问题,具体取决于定义所需结果的实际逻辑。
第一种也是最简单的方法是使用 GROUP BY 月份,并使用 MAX(column2) 等聚合函数仅获取非零行,或者如果要添加多个非零行,请使用和()。如果存在满足您的逻辑意图的聚合函数,则这是最佳解决方案。
另一种方法是在您的 JOIN 中包含更多条件,例如“WHERE a.month=b.month AND b.column2 > 0”,但如果可以有多个非零行,这仍然无法解决问题。
使用选项和COALESCE函数来确定列分组。
SELECT COALESCE(t1.Month, t2.Month, t3.Month) AS Month,
SUM(ISNULL(t1.Col1, 0)) AS t1Col1,
SUM(ISNULL(t2.Col1, 0)) AS t2Col1,
SUM(ISNULL(t3.Col1, 0)) AS t3Col1
FROM dbo.table1 t1 FULL OUTER JOIN dbo.table2 t2 ON t1.Month = t2.Month
FULL OUTER JOIN dbo.table3 t3 ON t1.Month = t3.Month
GROUP BY COALESCE(t1.Month, t2.Month, t3.Month)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57597 次 |
| 最近记录: |