2012-06-14 4 views
1

가입하고자하는 datepart에 대한 하위 쿼리가있는 두 개의 쿼리가 있습니다.tsql은 하위 쿼리의 datepart와 결합합니다.

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

DATEPART(YEAR... & DATEPART(MONTH...CONVERT(VARCHAR(4), DateInsert...을 교체 한 이유

나는 또한 가능한 한 오랫동안이 직업을 수행 최적화에 도움에 대한 날짜로 날짜를 유지하려면

, 이것은 이미 쿼리에서와 마찬가지로입니다 , 쿼리를 테이블로 사용할 수 있습니다. 글쎄, 당신은 많은 레이어에 대해 그렇게 할 수 있습니다 (읽기는 어렵습니다). – 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 

I보다 생각 해봐 UNION woul d는 MAX으로 매달 여러 행이 있다는 것을 의미하므로 월이 유일한 공통 필드이기 때문에 수락 된 답변에서 JOIN보다 실적이 좋습니다. 2012 년 6 월에 1000 개의 쿠폰이 표시되고 500 명이 쿠폰을 사용하면 교차 결합은 1500 대신 50,000 개의 행 중에서 최대를 선택한다는 것을 의미합니다. 나는 이것이 가능하지 않을 수 있도록 스키마와 로직을 확신하지는 않지만 FlurryCouponRedeemed에 날짜가있는 경우 FlurryCouponViewed에없는 경우에는 표시되지 않습니다. 내가 DATEADD(MONTH, DATEDIFF(MONTH, 0, DateInsert))