2015-08-06 4 views
1

Я пишу запрос, который учитывает жалобы компании. Запрос должен засчитывать общее количество жалоб от компании, а также разбить его на того, кто звонил из компании, чтобы подать жалобу. Так пример вывод будет:Несколько счетчиков в запросе

Company Ref Company Name Company Complaints Caller  Caller Complaints 
     11 Argos       10 Steve      8 
     11 Argos       10 JIM       2 

Так как вы можете видеть, что запрос подсчитывает общее количество жалоб, то и разбивает его о том, кто жаловался. До сих пор у меня все отличное от общего количества. Мой код:

SELECT COMPANYREF, 
     COMPANY,  
    (SELECT COUNT(COMPANYREF) 
    FROM XCALLSTABLE) AS CompanyCalls, 
     CALLER, 
     COUNT(*) 
FROM XCALLSTABLE 
JOIN XCUSTOMERTABLE ON (XCALLSTABLE.COMPANYREF = XCUSTOMERTABLE.CUSTREF) 
JOIN XTELEPHONETABLE ON (XCUSTOMERTABLE.TELEPHONE = XTELEPHONETABLE.PHONENUMBER) 
GROUP BY COMPANYREF, 
     COMPANY, 
     CALLER 
HAVING COUNT(*) > 0 ; 

Некоторый пример вывод для текущего кода:

Company Ref Company Name Company Complaints Caller  Caller Complaints 

     145 Comfiture Traders   500 Alexis Patel     4 

Вопрос здесь общее количество для компании просто подсчитывает каждую строку, в то время как я пытаюсь посчитать происходящих в этой компании.

Любая помощь была бы принята с благодарностью.

Использование кода sstan дал результат

111 Medusa Shipping 4 Lily Morgan 5 
111 Medusa Shipping 4 Ruby Walker 6 

В то время как результат должен быть

111 Medusa Shipping 11 Lily Morgan 5 
111 Medusa Shipping 11 Ruby Walker 6 
+0

Я думаю, что вы будете в порядке, если вы добавите MAX (...) вокруг подзаголовка для CompanyCalls. Как SELECT COMPANYREF, COMPANY, MAX ((SELECT ... FROM XCALLSTABLE)) как CompanyCalls ... Но вам также может понадобиться JOIN в вашем подзапросе, чтобы обеспечить одинаковые наборы данных. – Dennis

ответ

0

Я уверен, что есть более чистый способ сделать это, но следующий запрос должен работать:

SELECT companyref, 
     company, 
     CompanyCalls, 
     caller, 
     COUNT(*) 
    FROM (SELECT c.companyref, 
       company, 
       COUNT(*) OVER (PARTITION BY c.companyref) AS CompanyCalls, 
       caller 
      FROM xcallstable c 
      JOIN xcustomertable ct 
      ON ct.custref = c.companyref 
      JOIN xtelephonetable t 
      ON t.phonenumber = ct.telephone) 
GROUP BY companyref, company, CompanyCalls, caller 
HAVING COUNT(*) > 0 
+0

эй, приветствует помощь. Код выглядит хорошо, однако его подсчет вхождения имени компании в результате в отличие от подсчета вхождений в таблицу. – IzKenzie

+0

Я не понимаю разницы. Можете ли вы отредактировать свой пост с примером того, как мой запрос отличается от ожидаемого результата? Я основывался на примере, который вы предоставили. – sstan

+0

Я думаю, что понимаю проблему. Я скорректировал запрос в своем ответе. – sstan

Смежные вопросы