2013-05-23 5 views
0

"을"의 결과를 조인이 같은 조항과 2가 있습니다 또한

WITH T 
    AS (SELECT tfsp.SubmissionID, 
       tfsp.Amount, 
       tfsp.campaignID, 
       cc.Name 
     FROM tbl_FormSubmissions_PaymentsMade tfspm 
       INNER JOIN tbl_FormSubmissions_Payment tfsp 
        ON tfspm.SubmissionID = tfsp.SubmissionID 
       INNER JOIN tbl_CurrentCampaigns cc 
        ON tfsp.CampaignID = cc.ID 
     WHERE tfspm.isApproved = 'True' 
       AND tfspm.PaymentOn >= '2013-05-01 12:00:00.000' AND tfspm.PaymentOn <= '2013-05-07 12:00:00.000') 
SELECT SUM(Amount) AS TotalAmount, 
     campaignID, 
     Name 
FROM T 
GROUP BY campaignID, 
      Name; 

과 :

WITH T1 
    AS (SELECT tfsp.SubmissionID, 
       tfsp.Amount, 
       tfsp.campaignID, 
       cc.Name 
     FROM tbl_FormSubmissions_PaymentsMade tfspm 
       INNER JOIN tbl_FormSubmissions_Payment tfsp 
        ON tfspm.SubmissionID = tfsp.SubmissionID 
       INNER JOIN tbl_CurrentCampaigns cc 
        ON tfsp.CampaignID = cc.ID 
     WHERE tfspm.isApproved = 'True' 
       AND tfspm.PaymentOn >= '2013-05-08 12:00:00.000' AND tfspm.PaymentOn <= '2013-05-14 12:00:00.000') 
SELECT SUM(Amount) AS TotalAmount, 
     campaignID, 
     Name 
FROM T1 
GROUP BY campaignID, 
      Name; 

가 지금은 출력의 양의 결과를 가입하려는. 내가 어떻게 해?

편집 됨 : < = cluase도 추가되었습니다. 처음 T에서

의 reults : 내 T2에서

Amount-----ID----Name 
1000----- 2-----Annual Fund 
83--------1-----Athletics Fund 
300-------3-------Library Fund 

결과

850-----2-------Annual Fund 
370-----4-------Other 

는 출력은 내가 필요합니다

1800-----2------Annual Fund 
83-------1------Athletics Fund 
300------3-------Library Fund 
370------4-----Other 
+1

코드를 게시 할 때 다른 사람이 쉽게 읽을 수 있도록 포맷하십시오. 2 개의 쿼리의 차이점은 무엇입니까? 즉, 첫 번째 쿼리는 두 번째 쿼리에서 온 모든 레코드에 대한 결과를 포함합니다. date 절 이외에는 다른 내용이 없습니다. – shahkalpesh

+0

이것은 특정 시점 이후에 완료된 항목을 검색하고 중복 된 항목을 필터링하는 것처럼 실제로 "UNION SELECT" – DrCopyPaste

답변

1

가입 할 필요가 없습니다. 당신은 사용할 수 있습니다

SELECT SUM(tfspm.PaymentOn) AS Amount, 
     tfsp.campaignID, 
     cc.Name 
FROM tbl_FormSubmissions_PaymentsMade tfspm 
     INNER JOIN tbl_FormSubmissions_Payment tfsp 
     ON tfspm.SubmissionID = tfsp.SubmissionID 
     INNER JOIN tbl_CurrentCampaigns cc 
     ON tfsp.CampaignID = cc.ID 
WHERE tfspm.isApproved = 'True' 
     AND (tfspm.PaymentOn BETWEEN '2013-05-01 12:00:00.000' 
           AND '2013-05-07 12:00:00.000' 
       OR tfspm.PaymentOn BETWEEN '2013-05-08 12:00:00.000' 
            AND '2013-05-14 12:00:00.000') 
GROUP BY tfsp.campaignID, 
      cc.Name 
+0

을 사용해야하는 것처럼 나에게 보인다. 그러나 항상 그런 것은 아닙니다. 대부분 이것이 다음과 같이됩니다 : T는 첫 번째 주 데이터를 얻고 T1은 두 번째 주를 얻습니다. 내 원래 게시물을 수정하여 쉽게 이해할 수 있습니다. 도와 주셔서 감사합니다. –

+0

@ManishPatel - 수정 된 내용과 동기화되도록 수정되었습니다. '2013-05-07 12:00:00 및 <2013-05-08 12 : 00 : 00'이란 무엇입니까? –

+0

글쎄요, 편집을 다시 한 번 봅니다. 움직이는 표적을 따라 가려고 노력하지 않아도되지만, 지금은 단지'SUM (PaymentOn)'을하고'WHERE' 절을 조정하여 원하는 두 개의 정확한 범위. –

0

내가 맞다 경우 WITH 절 후 나중에 그 결과를 직접 선택해야합니다. 그래서 IMHO에 합류하기 위해 최선을 다하는 것은 각각 임시 테이블에 저장 한 다음이 두 테이블의 내용을 함께 결합하는 것입니다.

업데이트 : 질문을 다시 읽은 후 아마도 (SQL-) 조인을 원하지 않는다는 것을 알았지 만 2 개의 결과가 하나로 합쳐져서 위의 내용으로 쉽게 달성 할 수 있습니다. 두 임시 테이블의 내용을 선택하고 그 사이에 UNION을 넣으십시오.

0

나는 그것을 잘못 생각하고있었습니다. 도와 주셔서 감사합니다. 이것은 내가 원하는 것을 정확히 달성 한 것입니다 :

WITH 
T AS (
SELECT tfsp.SubmissionID , Amount1 = 
CASE 
WHEN tfspm.PaymentOn >= '2013-01-10 11:34:54.000' AND tfspm.PaymentOn <= '2013-04-10 11:34:54.000' THEN tfsp.Amount 
END 
, Amount2 = 
CASE 
WHEN tfspm.PaymentOn >= '2013-05-01 11:34:54.000' AND tfspm.PaymentOn <= '2013-05-23 11:34:54.000' THEN tfsp.Amount 
END 
, tfsp.campaignID , cc.Name FROM tbl_FormSubmissions_PaymentsMade tfspm 
INNER JOIN tbl_FormSubmissions_Payment tfsp ON tfspm.SubmissionID = tfsp.SubmissionID 
INNER JOIN tbl_CurrentCampaigns cc ON tfsp.CampaignID = cc.ID 
WHERE tfspm.isApproved = 'True' 

) 
SELECT ISNULL(SUM(Amount1),0) AS TotalAmount1, ISNULL(SUM(Amount2),0) AS TotalAmount2, campaignID , Name FROM T GROUP BY campaignID, Name;