2012-06-14 62 views
1

我有兩個查詢,它們是我喜歡加入的dateparts的子查詢。tsql在子查詢中加入了dateparts

SELECT DateMonth, DateYear, Datestring, 
    MAX(CouponTotalCount) NoOfCouponsViewed 
FROM (
     SELECT *, DATEPART(MONTH, DateInsert) DateMonth, DATEPART(YEAR, DateInsert) DateYear, 
     CONVERT(CHAR(4), DateInsert, 100) + CONVERT(CHAR(4), DateInsert, 120) Datestring 
     FROM FlurryCouponViewed 
    ) sub 
where couponID=249 
GROUP BY DateMonth, DateYear, Datestring 

SELECT DateMonth, DateYear, Datestring, 
    MAX(CouponTotalCount) NoOfCouponsRedeemed 
FROM (
     SELECT *, DATEPART(MONTH, DateInsert) DateMonth, DATEPART(YEAR, DateInsert) DateYear, 
     CONVERT(CHAR(4), DateInsert, 100) + CONVERT(CHAR(4), DateInsert, 120) Datestring 
     FROM FlurryCouponRedeemed 
    ) sub 

where couponID=249 
GROUP BY DateMonth, DateYear, Datestring 

輸出是兩個查詢的是:

DateMonth DateYear Datestring NoOfCouponsViewed 
----------- ----------- ---------- ----------------- 
2   2012  Feb 2012 5 
3   2012  Mar 2012 12 
4   2012  Apr 2012 25 
5   2012  May 2012 25 



DateMonth DateYear Datestring NoOfCouponsRedeemed 
----------- ----------- ---------- ------------------- 
2   2012  Feb 2012 3 
3   2012  Mar 2012 4 
4   2012  Apr 2012 5 
5   2012  May 2012 11 

我喜歡才達到的兩人一個連接查詢給我:

DateMonth DateYear Datestring NoOfCouponsViewed NoOfCouponsRedeemed 
----------- ----------- ---------- ----------------- ------------------- 
2   2012  Feb 2012 5     3 
3   2012  Mar 2012 12    4 
4   2012  Apr 2012 25    5 
5   2012  May 2012 25    11 

我怎樣才能做到這一點?

+1

正如你在你的查詢肯定已經,您可以將查詢用作表格。那麼,你可以爲許多層做到這一點(儘管它可能很難閱讀)。 – Limey

回答

1

使這兩個查詢之間的內部連接,它應該工作:

SELECT sub.DateMonth, sub.DateYear, sub.Datestring, 
    MAX(sub.CouponTotalCount) NoOfCouponsViewed, 
    MAX(sub2.CouponTotalCount) NoOfCouponsViewed 
FROM (
     SELECT *, DATEPART(MONTH, DateInsert) DateMonth, DATEPART(YEAR, DateInsert) DateYear, 
     CONVERT(CHAR(4), DateInsert, 100) + CONVERT(CHAR(4), DateInsert, 120) Datestring 
     FROM FlurryCouponViewed 
    ) sub 
INNER JOIN 
    ( SELECT *, DATEPART(MONTH, DateInsert) DateMonth, DATEPART(YEAR, DateInsert) DateYear, 
     CONVERT(CHAR(4), DateInsert, 100) + CONVERT(CHAR(4), DateInsert, 120) Datestring 
     FROM FlurryCouponRedeemed 
    ) sub2 on sub.DateMonth = sub2.DateMonth and sub.DateYear = sub2.DateYear and sub.Datestring = sub2.Datestring 
where sub.couponID=249 and sub2.couponID=249 
GROUP BY sub.DateMonth, sub.DateYear, sub.Datestring 
1

UNION

SELECT u.DateMonth, u.DateYear, u.Datestring, MAX(u.NoOfCouponsViewed), MAX(u.NoOfCouponsRedeemed) 
    FROM (
     SELECT DateMonth, DateYear, Datestring, 
      MAX(CouponTotalCount) NoOfCouponsViewed, 0 AS NoOfCouponsRedeemed 
     FROM (
      SELECT *, DATEPART(MONTH, DateInsert) DateMonth, DATEPART(YEAR, DateInsert) DateYear, 
      CONVERT(CHAR(4), DateInsert, 100) + CONVERT(CHAR(4), DateInsert, 120) Datestring 
      FROM FlurryCouponViewed 
      ) sub 
     where couponID=249 
     GROUP BY DateMonth, DateYear, Datestring 
    UNION 
     SELECT DateMonth, DateYear, Datestring, 0 AS NoOfCouponsViewed, 
      MAX(CouponTotalCount) NoOfCouponsRedeemed 
     FROM (
      SELECT *, DATEPART(MONTH, DateInsert) DateMonth, DATEPART(YEAR, DateInsert) DateYear, 
      CONVERT(CHAR(4), DateInsert, 100) + CONVERT(CHAR(4), DateInsert, 120) Datestring 
      FROM FlurryCouponRedeemed 
      ) sub 

     where couponID=249 
     GROUP BY DateMonth, DateYear, Datestring 
    ) u 
GROUP BY u.DateMonth, u.DateYear, u.Datestring 
+1

@aF。感謝編輯 –

0

我會用UNION而不是JOIN

SELECT MonthInserted, 
     LEFT(DATENAME(MONTH, Datestring), 3) + ' ' + DATENAME(YEAR, MonthInserted) AS DateString 
     MAX(Viewed) NoOfCouponsViewed, 
     MAX(Redeemed) NoOfCouponsRedeemed 
FROM ( SELECT CouponID, 
        DATEADD(MONTH, DATEDIFF(MONTH, 0, DateInsert)) [MonthInserted], 
        CouponTotalCount AS Viewed, 
        0 AS Redeemed 
      FROM FlurryCouponViewed 
      UNION ALL 
      SELECT CouponID, 
        DATEADD(MONTH, DATEDIFF(MONTH, 0, DateInsert)), 
        0, 
        CouponTotalCount 
      FROM FlurryCouponRedeemed 
     ) sub 
WHERE couponID = 249 
GROUP BY MonthInserted 

我認爲是一個UNION woul d在接受的答案中表現得比JOIN更好,因爲MAX意味着每月有多行,並且由於月是唯一的通用字段,所以它最終會交叉連接查詢(即,如果在2012年6月查看1000張優惠券並且500次兌換,交叉加入意味着您將從50,000行中選擇最大值而不是1500)。我不確定架構和邏輯,所以這可能是不可能的,但如果FlurryCouponRedeemed中的日期不在FlurryCouponViewed中,那麼這些日期將不會顯示。

我也想保持日期爲日期,只要能夠幫助優化器做的工作,這就是爲什麼我把它換成DATEPART(YEAR... & DATEPART(MONTH...CONVERT(VARCHAR(4), DateInsert...DATEADD(MONTH, DATEDIFF(MONTH, 0, DateInsert))