Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组合两个sql查询,每个查询都有一个with子句_Sql_Sql Server - Fatal编程技术网

组合两个sql查询,每个查询都有一个with子句

组合两个sql查询,每个查询都有一个with子句,sql,sql-server,Sql,Sql Server,我有两个查询正在为我做这项工作,但我想将它们合并在一个表中,而不是将过去的结果复制到excel中 第一个查询提供了2018年每月至少有一个订阅过期的用户数: WITH UniqueUsers AS ( SELECT DISTINCT MONTH(ValidTo) ExpireMonth, UserId FROM UserInAppPurchase WHERE YEAR(ValidTo) = 2018 ) SELEC

我有两个查询正在为我做这项工作,但我想将它们合并在一个表中,而不是将过去的结果复制到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;
    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;
第二个查询给出了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;
    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年的月份 第二列:第一次查询的结果 第三列:第二次查询的结果

仅仅复制这两个结果并手动组合它们并没有太大的危害,但我很好奇如何直接在SQL中实现这一点


感谢您的帮助

给您,您可以加入CTEs

 ;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

您可以将每个结果存储在单独的临时表中,例如,创建如下两个临时表:

CREATE Table #ExpiryDates (ExpireMonth int, TotalUsers int)
CREATE Table #PurchaseDates (PurchaseMonth int, TotalUsers int)
;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;
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_;
然后将第一个查询结果存储到临时表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;
第二个查询如下:

CREATE Table #ExpiryDates (ExpireMonth int, TotalUsers int)
CREATE Table #PurchaseDates (PurchaseMonth int, TotalUsers int)
;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;
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_;
最后,将这些问题合并到一个查询中

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

如果这能解决您的问题,请告诉我。

您可以这样使用smth:

CREATE Table #ExpiryDates (ExpireMonth int, TotalUsers int)
CREATE Table #PurchaseDates (PurchaseMonth int, TotalUsers int)
;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;
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_;

但我不确定你们的订货条款是否是你们想要的。您的月份将按1、11、12排序。也许您需要另一个订单,我只是重写了您的查询以便将它们组合起来。

我会取消日期,然后进行聚合:

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);

这种逻辑实际上不需要子查询、显式联接或CTE。

您的预期输出是什么?将我的帖子与我的预期输出一起发送。因此,假设我愿意在2019年执行此操作。在那里,我确实有ExpireMonth中的值,但没有PurchaseMonth中的值,因为还没有购买。现在,当用2019年取代2018年时,结果只显示1月和2月,因为PurchaseMonth还没有数据。但是我怎么能强迫所有的12个月呢?因此,当PurchaseMonth中不计算任何值时,只显示0?此查询使用内部联接,这意味着在PurchaseMonth和ExpireMonth不同的情况下,例如,有1作为PurchaseMonth,没有1作为ExpireMonth,结果查询将不包含1