1

我有两个查询,其中包含我喜欢加入的日期部分的子查询。

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

我怎样才能做到这一点 ?

4

3 回答 3

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
于 2012-06-14T13:16:40.880 回答
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 回答
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

我认为 aUNION会比JOIN接受的答案中的表现更好,因为这MAX意味着每月有多行,并且由于月份是唯一的公共字段,因此它将最终交叉连接查询(即,如果在 2012 年 6 月查看了 1000 张优惠券并且 500 被兑换了交叉连接意味着您将从 50,000 行中选择最大值,而不是 1500)。我不确定架构和逻辑,所以这可能是不可能的,但如果 FlurryCouponRedeemed 中有日期不在 FlurryCouponViewed 中,则这些日期不会显示。

我也喜欢尽可能长时间地保留日期,以帮助优化器完成它的工作,这就是我用DATEPART(YEAR...& DATEPART(MONTH...ANDCONVERT(VARCHAR(4), DateInsert...替换的原因DATEADD(MONTH, DATEDIFF(MONTH, 0, DateInsert))

于 2012-06-14T13:27:15.430 回答