2016-11-28 4 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

Потому что, как вы можете видеть в ссылке, результат показывает количество неверно. Почему все подсчеты показаны как 5 для идентификаторов абонента 1 и 6 для идентификатора абонента 2? –

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 right, то 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, а также с подписчиком. –