创建一年的动态SQL语句

时间:2019-02-03 15:05:23

标签: sql sql-server

我想将2018年每月的新订阅数与每月结束订阅数进行比较,并将其合并到一张表中。

以x轴表示2018年的月份(例如1月,2月,依此类推),以y轴作为第一行,我的第一个sql查询=该月中已用完的订阅数。第二行是我的第二个sql查询=该月新订阅的数量。我下面的“查询”以2018年3月为例。

SELECT    
    COUNT (UserId)
FROM
    UserInAppPurchase 
WHERE 
    ValidTo > '2018-03-01' AND ValidTo < '2018-03-31' 
GROUP BY
    UserId

SELECT COUNT(UserId)
FROM UserInAppPurchase 
WHERE PurchaseDate > '2018-03-01' 
  AND PurchaseDate < '2018-03-31' 
GROUP BY UserId

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果要计算用户ID,则不应按用户ID分组

SELECT    COUNT (UserId), 'valid_to'
FROM      UserInAppPurchase WHERE ValidTo>'2018-03-01' and  ValidTo<'2018-03-31' 
union  all  
SELECT    COUNT (UserId), 'PurchaseDate'
FROM      UserInAppPurchase WHERE PurchaseDate>'2018-03-01' and PurchaseDate<'2018-03-31'

答案 1 :(得分:1)

如果我理解正确,上述查询将在一个月内返回多行,这将取决于下订单的唯一身份用户总数。然后对于每个月,每个用户都是两个垂直行业,该图将是3D图,我认为这里不是这种情况。 因此,我可以想到2种情况,

  1. 您希望每个月的每月订阅总数过期

    SELECT MONTH(ValidTo) ExpireMonth, COUNT(UserId) ExpireCount
    FROM UserInAppPurchase 
    WHERE YEAR(ValidTo) = 2018
    GROUP BY MONTH(ValidTo);
    
  2. 您想知道至少一个订阅已过期的用户数量

    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;
    

类似的查询也将用于购买的订阅。

请让我知道您的要求是否有所不同。