结合具有子句中的两个SQL查询

问题描述 投票:0回答:4

我有两个疑问谁在做这份工作对我,但我想将它们结合起来,有一个表,而不是复制的结果过去的结果到Excel中。

首先查询给我的用户,其至少一个订阅2018年每月已过期的号码:

    WITH UniqueUsers AS
    (
        SELECT DISTINCT MONTH(ValidTo) ExpireMonth, UserId
        FROM UserInAppPurchase 
        WHERE YEAR(ValidTo) = 2018
    )
    SELECT ExpireMonth, COUNT(UserId) UserCount
    FROM UniqueUsers
    GROUP BY ExpireMonth order by ExpireMonth;

第二个查询给我的用户,其在2018年至少取得每月一个订阅购买数量:

    WITH UniqueUsers AS
    (
        SELECT DISTINCT MONTH(PurchaseDate) PurchaseMonth, UserId
        FROM UserInAppPurchase 
        WHERE YEAR(PurchaseDate) = 2018
    )

   SELECT PurchaseMonth, COUNT(UserId) UserCount
   FROM UniqueUsers
   GROUP BY PurchaseMonth order by PurchaseMonth;

其实PurchaseMonth和ExpireMonth是相同的。

我的预期成果是:第1栏:2018个月 第2列:从第一次查询结果 3ND柱:从第二查询结果

这是不是一个很大的伤害,刚才复制的两个结果和手工组合它们,但我很好奇如何直接在SQL做。

谢谢您的帮助

sql sql-server
4个回答
1
投票

我会unpivot的日期,并刚做聚合:

SELECT MONTH(dte) as mon,
       COUNT(DISTINCT ExpireUserId) as numExpiredUsers,
       COUNT(DISTINCT PurchaseUserId) as numPurchaseUsers
FROM UserInAppPurchase uiap CROSS APPLY
     (VALUES (ValidTo, UserId, NULL),
             (PurchaseDate, NULL, UserId)
    ) v(dte, ExpireUserId, PurchaseUserId)
WHERE dte >= '2018-01-01' AND dte < '2019-01-01'
GROUP BY MONTH(dte) 
ORDER BY MONTH(dte);

真正需要这个逻辑没有子查询,明确JOINs,或热膨胀系数。


0
投票

您可以使用水木清华这样的:

with months as 
(
SELECT  MONTH(ValidTo) as month_
FROM UniqueUsers
WHERE YEAR(ValidTo) = 2018
union
SELECT  MONTH(PurchaseDate)
FROM UniqueUsers
WHERE YEAR(PurchaseDate) = 2018
),

UniqueUsers AS
(
    SELECT MONTH(PurchaseDate) as ExpireMonth, 
           COUNT(UserId) UserCount
    FROM UniqueUsers
    WHERE YEAR(ValidTo) = 2018
    GROUP BY MONTH(PurchaseDate)
),


UniqueUsers1 AS
(

   SELECT MONTH(PurchaseDate) as PurchaseMonth, 
          COUNT(UserId) UserCount1
   FROM UniqueUsers
   WHERE YEAR(PurchaseDate) = 2018
   GROUP BY MONTH(PurchaseDate)
)


select m.month_, 
       u.UserCount,
       u1.UserCount1
from  months m
      left join UniqueUsers u
         on m.month_ = u.ExpireMonth
      left join UniqueUsers1 u1
         on m.month_ = u1.PurchaseMonth
order by m.month_;

但我不知道你的order by条款是你想要的。您的月将被分拣为1,11,12,也许你想下订单,我只是改写了您的查询,以便将它们结合起来。


0
投票

在这里,您都可以加入的CTE

 ;WITH UniqueUsers1
AS (
    SELECT DISTINCT MONTH(ValidTo) ExpireMonth
        ,UserId
    FROM UserInAppPurchase
    WHERE YEAR(ValidTo) = 2018
    )
    ,UniqueUsers2
AS (
    SELECT DISTINCT MONTH(PurchaseDate) PurchaseMonth
        ,UserId
    FROM UserInAppPurchase
    WHERE YEAR(PurchaseDate) = 2018
    )
SELECT *
FROM (
    SELECT ExpireMonth
        ,COUNT(UserId) UserCount
    FROM UniqueUsers1 c1
    GROUP BY ExpireMonth
    ) First
INNER JOIN (
    SELECT PurchaseMonth
        ,COUNT(UserId) UserCount
    FROM UniqueUsers2
    GROUP BY PurchaseMonth
    ) Sec ON First.ExpireMonth = Sec.PurchaseMonth

0
投票

你可以存储在单独的临时表中的每个结果,例如像这样创建两个临时表:

CREATE Table #ExpiryDates (ExpireMonth int, TotalUsers int)
CREATE Table #PurchaseDates (PurchaseMonth int, TotalUsers int)

然后第一个查询结果存储到临时表#ExpirayDates

;WITH UniqueUsers AS
(
    SELECT DISTINCT MONTH(ValidTo) ExpireMonth, UserId
    FROM UserInAppPurchase 
    WHERE YEAR(ValidTo) = 2018
)
INSERT INTO #ExpiryDates (ExpireMonth, TotalUsers)
SELECT ExpireMonth, COUNT(UserId) UserCount
FROM UniqueUsers
GROUP BY ExpireMonth order by ExpireMonth;

第二个查询会是这样:

;WITH UniqueUsers AS
(
    SELECT DISTINCT MONTH(PurchaseDate) PurchaseMonth, UserId
    FROM UserInAppPurchase 
    WHERE YEAR(PurchaseDate) = 2018
)
INSERT INTO #PurchaseDates (PurchaseMonth, TotalUsers)
SELECT PurchaseMonth, COUNT(UserId) UserCount
FROM UniqueUsers
GROUP BY PurchaseMonth order by PurchaseMonth;

最后,compine这些成一个查询

SELECT p.PurchaseMonth MonthNumber, p.TotalUsers As UsersMadePurchases, 
       e.ExpireMonth, e.TotalUsers As UsersExpiredSubs 
FROM #PurchaseDates p
LEFT JOIN #ExpiryDates e
    ON e.ExpireMonth = p.PurchaseMonth

结果将是:

MonthNumber UsersMadePurchases  ExpireMonth  UsersExpiredSubs
4           1                   NULL         NULL
5           2                   5            2
6           2                   6            2
7           1                   7            1
8           1                   8            1

让我知道如果这能解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.