2014-04-01 2 views
1

표 1 :누락 된 기록 2008R2

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 

, 나는 수 없습니다입니다 PlacementID 103 및 campaignID 10과 Cost 8000을 표시하는 table2의 마지막 행인 흔치 않은 레코드를 얻으려고합니다. 그러나 모든 원시 데이터와 파일을 검색했지만 누락 된 레코드는 두 소스간에 공통적이지 않습니다. 그러나이 레코드를 최종 테이블에 포함하고자합니다. 어떻게해야합니까? 이 두 테이블은 두 개의 다른 소스이며 결과는 공통 ​​레코드 만 있습니다.

또한 누락 된 값은 최종 값에 필요한 정확한 값이므로 모든 것을 포함하고자합니다. 나는 아래에있는 내 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 

소스에 비용이 하나 개의 배치 만 한 번에 할당했기 때문에 나는 그래서 그 분할해야 배치함으로써 비용을 분할하고 있기 때문에 같은 Placementid 반복 더 실제 테이블에 같은 날짜에 1 번 이상.

+0

안녕하세요. [최근 질문] (https://stackoverflow.com/questions/44422870/convert-transfer-multiple-value-into-columns/44424157)이 너무 광범위하게 닫힌 이유에 대해 대화하고 싶다면 예기치 않게 삭제됨), Ping을 수행하십시오. 이유를 설명하려고합니다. 귀하의 다른 질문에 추가 한 광범위한 조언은 귀하가 귀하의 답변 중 일부를 수락하는 것을 보는 것이 좋을 것입니다. 도움이 필요하면 알려주세요. – halfer

답변

2

당신은 내가 여기 추측 어떤 예상 출력을 제공하지 않았다 그러나 당신이 원하는 결과가이 경우 :

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) 

샘플 SQL Fiddle

+0

jpw : yes 테이블에 표시된 것과 같은 결과를 원하지만 COALESCE를 사용하여 솔루션을 시도한 결과 필요한 결과가 나타나지 않았습니다. 전에 얻은 결과와 같은 결과였습니다. – ADBI

+0

@ user3299024 나는 COALESCE 옆에있는 다른 것들을 바꿨다. 이 SQL Fiddle을보십시오 : http://www.sqlfiddle.com/#!3/cc480e/12 – jpw

+0

@ user3299024 : 죄송 합니다만, jpw가 전에 한 것처럼 COALESCE를 제외한 모든 변경 사항을 보지 못했습니다. 하지만 둘 다 고마워. 긴급한 상황에서이 문제를 해결하기 위해 나를 도우 실 수 있습니까? – ADBI

관련 문제