2016-11-28 142 views
1

我有一个“结算”表,它代表来自我的订户的所有帐单实例。订户可以有多个帐单。具有特定ID的行的数量,不包含SQL

我有一个简单的SQL请求是:

SELECT count(billing_id),subscriber_id 
FROM billing 
    group by subscriber_id 

因此,我有我的所有用户提供他们已经取得账单数目的清单。 我想要列出所有没有按用户分组的帐单,但我希望先前请求的结果出现在每行中。

例子: 结果我以前的要求:

sub_id  nb_billings 
    1    3 
    2    2 

我想要什么:

sub_id  nb_billings 
    1    3 
    1    3 
    1    3 
    2    2 
    2    2 

感谢

+2

为什么?这是奇怪的要求... – Rahul

回答

1

我会这样做;

SELECT 
    b.subscriber_id 
    ,a.billing_count 
FROM billing b 
JOIN (SELECT subscriber_id, count(billing_id) billing_count FROM billing GROUP BY subscriber_id) a 
    ON b.subscriber_id = a.subscriber_id 

子查询工作了BILLING_ID的计数的用户,那么这个连接到您的原始表中的所有行(使用subscriber_id)。这应该给你后面的结果。

+0

我想这是错误的。看到这里 - > http://rextester.com/IUKAP28031。总数在5和6之间,远高于表中的总行数。 –

+0

@SatwikNadkarny是什么让你相信这是错的?它完全符合OP的要求(并已被OP接受)。从“我想列出所有账单没有按用户分组”的问题来看,它没有提到billing_id的分组。 –

+0

因为您可以在链接中看到,结果显示计数不正确。为什么用户ID为1的所有计数显示为5,用户ID为2的显示为6? –

1

您可以使用子查询做到这一点:

SELECT 
    (SELECT count(t2.billing_id) FROM billing t2 WHERE t2.subscriber_id = t1.subscriber_id), 
    t1.subscriber_id 
FROM billing t1 
+0

担心这个查询在大型数据集上的性能 – Rahul

+0

@Rahul U're没错,那么op可以像** @ Rich Benner **的解决方案。 – Blank

+0

接受另一个答案,因为它更加优化,但使用你的,因为它清晰和容易(请求本身非常复杂,所以这个解决方案很容易设置) –

-1
select subscriber_id,count(billing_id)over(partition by subscriber_id) 
from billing 

会做到这一点。

+0

你读过这篇文章吗?它的标签为'MySQL' – Rahul

1

我想这应该足够了:

SELECT  s.subscriber_id, 
      s.billing_id, 
      s.TotalCount 
FROM  (
       SELECT  subscriber_id, 
          billing_id, 
          COUNT(billing_id) AS TotalCount 

       FROM  BILLING 
       GROUP BY subscriber_id, 
          billing_id 
      ) s 
GROUP BY s.subscriber_id, 
      s.TotalCount, 
      s.billing_id 

ORDER BY s.subscriber_id 

这应该给你的结果如下:

subscriber_id billing_id TotalCount 
1     10a   2 
1     10b   2 
1     10c   1 
2     10a   1 
2     10b   1 
2     10c   3 
2     10d   1 

这里你可以看到这一点 - >http://rextester.com/AVVS23801

希望这有助于!

+0

我不认为OP希望它通过billing_id和subscriber_id来分组。 –

相关问题