1

参加したい日付部分のサブクエリを含む2つのクエリがあります。

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

2つのクエリの出力は次のとおりです。

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

私が達成したいのは、2つが1つの結合されたクエリを持っていることです。

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

これどうやってするの ?

4

3 に答える 3

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
于 2012-06-14T13:21:05.560 に答える
1

2つのクエリを内部結合すると、機能するはずです。

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
于 2012-06-14T13:16:40.880 に答える
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よりもパフォーマンスが優れていると思います。月が唯一の共通フィールドであるため、クロスジョインクエリになります(つまり、2012年6月に1000枚のクーポンが表示された場合) 500はクロス結合と引き換えられます。つまり、1500行ではなく50,000行から最大値を選択することになります。スキーマとロジックがわからないため、これが不可能な場合がありますが、FlurryCouponRedeemedにFlurryCouponViewedにない日付がある場合、これらは表示されません。JOINMAX

また、オプティマイザーが仕事をするのを助けるために、日付をできるだけ長く保持するのが好きです。これが、私が置き換えた理由ですDATEPART(YEAR...DATEPART(MONTH...CONVERT(VARCHAR(4), DateInsert...DATEADD(MONTH, DATEDIFF(MONTH, 0, DateInsert))

于 2012-06-14T13:27:15.430 に答える