Sql server 2008 SQL Server 2008R2中的一个表中缺少记录
表1:Sql server 2008 SQL Server 2008R2中的一个表中缺少记录,sql-server-2008,missing-data,Sql Server 2008,Missing Data,表1: Date PlacementID CampaignID Impressions 04/01/2014 100 10 1000 04/01/2014 101 10 1500 04/01/2014 100 11 500 表2: Date PlacementID Cam
Date PlacementID CampaignID Impressions
04/01/2014 100 10 1000
04/01/2014 101 10 1500
04/01/2014 100 11 500
表2:
Date PlacementID CampaignID Cost
04/01/2014 100 10 5000
04/01/2014 101 10 6000
04/01/2014 100 11 7000
04/01/2014 103 10 8000
当我使用Full Join和Left Join语句连接此表时,我无法获得不常见的记录,这是表2中显示PlacementID 103和ActivityID 10且成本为8000的最后一行。然而,我已经搜索了所有原始数据和文件,但这两个源之间缺少的记录并不常见。然而,我想把这些记录包括在最终的表中。我该怎么做?这两个表是两个不同的来源,我得到的结果只有普通记录
此外,当我发现缺少的值是最终图中所需的精确值时,我希望包括所有内容。我正在将我的SQL脚本包括在下面:
SELECT A.palcementid,
A.campaignid,
A.date,
Sum(A.impressions) AS Impressions,
Sum(CASE
WHEN C.placement_count > 1 THEN ( B.cost / C.placement_count )
ELSE B.cost
END) AS Cost
FROM table1 A
FULL JOIN table2 B
ON A.placementid = B.placementid
AND A.campaignid = B.campaignid
AND A.date = B.date
LEFT JOIN (SELECT Count(A.placementid) AS Placement_Count,
placementid. campaignid,
date
FROM table1
GROUP BY placementid,
campaignid,
date) c
ON A.placementid = C.placementid
AND A.campaignid = C.campaignid
AND A.date = C.date
GROUP BY A.placementid,
A.campaignid,
A.date
我将成本除以放置,因为在源代码中,成本仅分配给一个放置和一次放置,所以我必须将其除以,因为在实际表中,同一放置在同一日期重复超过1次。由于您没有提供任何预期输出,我在这里猜测,但如果您想要的结果是:
PlacementID CampaignID Date Impressions Cost
----------- ----------- ----------------------- ----------- -----------
100 10 2014-04-01 02:00:00.000 1000 5000
100 11 2014-04-01 02:00:00.000 500 7000
101 10 2014-04-01 02:00:00.000 1500 6000
103 10 2014-04-01 02:00:00.000 NULL 8000
然后,下面的查询将执行此操作:
SELECT COALESCE(A.PlacementID,b.placementid) AS PlacementID,
COALESCE(A.campaignid, b.campaignid) AS CampaignID,
COALESCE(A.date, b.date) AS [Date],
SUM(A.impressions) AS Impressions,
SUM(CASE
WHEN C.placement_count > 1 THEN ( B.cost / C.placement_count )
ELSE B.cost
END ) AS Cost
FROM table1 A
FULL JOIN table2 B
ON A.[PlacementID] = B.placementid
AND A.campaignid = B.campaignid
AND A.date = B.date
LEFT JOIN (SELECT COUNT(PlacementID) AS Placement_Count,
placementid, campaignid,
date
FROM table1
GROUP BY placementid,
campaignid,
date) c
ON A.[PlacementID] = C.placementid
AND A.campaignid = C.campaignid
AND A.date = C.date
GROUP BY COALESCE(A.PlacementID, B.PlacementID),
COALESCE(A.campaignid, b.campaignid),
COALESCE(A.date, b.date)
示例jpw:是的,我希望得到与表中所示相同的结果,但当我尝试使用COALESCE解决方案时,所需的结果没有出现。这和我之前得到的结果是一样的。@user3299024我确实改变了合并之外的一些其他东西;看看这个SQL提琴:@user3299024:对不起,先生,除了像jpw以前做的那样合并之外,我没有看到任何变化。但是,谢谢你们两位。您能帮我解决这个紧急问题吗。@jpe:谢谢jpw的建议和帮助。@user3299024您是否查看了SQL FIDLE并尝试了输入的查询?您好。如果你想就为什么被关闭太广泛(然后意外删除)进行对话,请ping我,我将尝试给出原因。我的广泛建议是,如果你能接受你的一些答案,那将是一件好事。我已经在你的其他一些问题中补充了这个建议。如果你需要帮助,请告诉我。