我正在努力解决最后几个小时的任务......
我有四张桌子:
Users (ID INT, Fullname VARCHAR(255))
Segments (Value VARCHAR(255))
Report_1 (ID INT, UserID INT, Segment VARCHAR(255), Total INT)
Report_2 (ID INT, UserID INT, Segment VARCHAR(255), Total INT)
...我需要获得所有可能细分的所有用户的报告。
但“Report_1”,“Report_2”的报告可能没有某些用户或细分受众群的记录。
结果查询必须包含以下列:
UserID, Segment, Report_1.Total(OR NULL), Report_2.Total(OR NULL)
我可以使用CROSS JOIN / APPLY吗?
答案 0 :(得分:3)
使用外连接的简单笛卡尔连接应该可以解决这个问题:
SELECT Users.ID AS [UserID], Segments.Value AS [Segment], Report_1.Total, Report_2.Total
FROM Users, Segments
LEFT OUTER JOIN Report_1 ON
Report_1.UserID = Users.ID AND Report_1.Segment = Segments.Value
LEFT OUTER JOIN Report_2 ON
Report_2.UserID = Users.ID AND Report_2.Segment = Segments.Value
答案 1 :(得分:0)
我建议的最好的是:
SELECT
U.UserID,
S.Value,
ISNULL(R1.Total, 0),
ISNULL(R2.Total, 0)
FROM
Users U
CROSS APPLY (
SELECT DISTINCT Value FROM Segment
) S
LEFT JOIN (
SELECT
SUM(Total) AS Total,
Segment,
UserID
FROM
Report_1
GROUP BY
Segment,
UserID
) R1 ON
R1.UserID = U.UserID AND
R1.Segment = S.Value
LEFT JOIN (
SELECT
SUM(Total) AS Total,
Segment,
UserID
FROM
Report_2
GROUP BY
Segment,
UserID
) R2 ON
R2.UserID = U.UserID AND
R2.Segment = S.Value
我希望 CROSS APPLY ...
的用法很好