“with”子句的内连接结果

时间:2013-05-23 14:03:52

标签: sql sql-server sql-server-2008

我有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; 

现在我想加入两个输出的结果。我该怎么做?

已编辑:同时添加&lt; = cluase。

来自我的第一个T:

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

我T2的结果

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

我需要输出:

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

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

如果我是对的,在WITH-clause之后你必须立即选择结果。所以恕我直言,你最好的尝试加入两者将是将每个人保存到临时表中,然后将这两者的内容加在一起。

更新:在重新阅读你的问题后,我意识到你可能不想要(SQL-)加入,只是将你的2个结果打包在一起,所以你可以轻松地实现上述我所描述的,只需选择两个临时表的内容,并在它们之间放置一个UNION。

答案 2 :(得分: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;