Sql server 2008 SQL Server 2008R2中的一个表中缺少记录

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

表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      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我,我将尝试给出原因。我的广泛建议是,如果你能接受你的一些答案,那将是一件好事。我已经在你的其他一些问题中补充了这个建议。如果你需要帮助,请告诉我。