聚合SQL结果,两个表,然后汇总结果

时间:2016-05-12 16:16:41

标签: sql sql-server

使用MSSQL

我有一个用户表,以及他们订阅的产品表。这些订阅是免费(F)或付费(P)。我已经加入了表格,使用case语句将F / P值转换为数字,然后按用户ID对这些值进行求和,这个想法是任何只有免费帐户的人都会得到0,那些至少有一个付费帐户的值为1或更高。我已经完成了以下任务:

SELECT t1.user_id, SUM(
    CASE
        WHEN t2.free_paid = 'P'
            THEN 1
        ELSE 0
    END ) as highest
FROM users t1 INNER JOIN accounts t2
    ON t1.user_id = t2.user_id
WHERE t2.account = 'A'
GROUP BY t1.user_id
ORDER BY t1.user_id

这会产生如下结果:

755   2
1259  2
2031  1
3888  0

意味着除3888以外的所有人都至少拥有一个付费帐户。

但是现在我想简单地添加一些来获取我们的两个值,一个是至少有一个付费帐户的用户数(例如3个),以及只有免费帐户的用户数(例如1个) )。

我尝试声明两个变量,例如@free和@paid并使用case语句通过将其包装在上面并将其视为子查询来添加到这些值,但我无法运行。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

重新使用问题中的查询,您可以创建CTE(或子查询)并汇总结果:

ID | INCOME | START_DATE | END_DATE
 1 |   2000 | 02/01/2016 | 05/31/2016
 1 |   1500 | 12/01/2015 | 01/31/2016
 2 |   1000 | 01/01/2016 | 04/30/2016

答案 1 :(得分:1)

SELECT 
COUNT(DISTINCT CASE WHEN t2.free_paid = 'P' THEN t1.user_id END) as atleast_one_paid,
COUNT(DISTINCT CASE WHEN t2.free_paid <> 'P' THEN t1.user_id END) as onlyfree
FROM users t1 
INNER JOIN accounts t2 ON t1.user_id = t2.user_id
WHERE t2.account = 'A'

答案 2 :(得分:1)

你可以绕过原始查询并总结一下

SELECT SUM (case when highest > 0 THEN 1 else 0 END) as UsersWithPaidAccount,
SUM (case when highest = 0 THEN 1 else 0 END) as UsersWithOnlyFreeAccount
FROM (SELECT t1.user_id, SUM(
    CASE
        WHEN t2.free_paid = 'P'
            THEN 1
        ELSE 0
    END ) as highest
FROM users t1 INNER JOIN accounts t2
    ON t1.user_id = t2.user_id
WHERE t2.account = 'A'
GROUP BY t1.user_id)
as DerivedTable