Огненная птица 1.5 Союз

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

select
count(case when call_type='I' and cl.client_ID not like 391 and c.call_start  >= '2017/04/01' and c.call_start  <= '2017/04/30'then 1 else null end) as Incoming_Main_April, 
count(case when call_type='O' and cl.client_ID not like 391 and c.call_start  >= '2017/04/01' and c.call_start  <= '2017/04/30'then 1 else null end) as Outgoing_Main_April,
count(case when call_type='I' and cl.client_ID=391 and c.call_start  >= '2017/04/01' and c.call_start  <= '2017/04/30'then 1 else null end) as Incoming_SMG_April,
count(case when call_type='O' and cl.client_ID=391 and c.call_start  >= '2017/04/01' and c.call_start  <= '2017/04/30'then 1 else null end) as Outgoing_SMG_April

from
  CALLS c 
  left outer join CONTACTS ct on c.CONTACT_ID= ct.CONTACT_ID
  left outer join clients cl on cl.client_id= ct.COMPANY_ID where cl.RECORD_STATUS='A' 
  and c.OPERATOR_ID in (1510,2938,12443,4482,8911,6947,2056,1969,1952,2223,1511,2224,2039,2055,2085,1949,5963,1502,11112,1633,2034,2057)  

order by
  count(call_type)

приведенное выше, например, даст мне 4 столбца с 1 строкой результата. Теперь хотелось бы, чтобы март (например) был на второй строчке... и так далее.

предложения?


person Leo Fazzi    schedule 23.05.2017    source источник
comment
Ваш запрос представляет собой нечитаемую стену текста. Можете ли вы отформатировать его, а также предоставить схему вашей БД, а также образцы данных и желаемый результат? В противном случае я сомневаюсь, что кто-то будет тратить свое время на попытки понять ваш вопрос.   -  person Andy Korneyev    schedule 23.05.2017
comment
Извинения. Думал, что это можно увидеть правильно. Рассчитывайте на входящие и исходящие звонки на 2 разных клиентах. на каждый месяц. Я использовал «союз всех» и работает. но я бы хотел, чтобы в каждой строке было другое имя...   -  person Leo Fazzi    schedule 23.05.2017
comment
Я предполагаю, что вы хотите использовать союз, так как вы включили его в свой заголовок? Если это так, все, что вам нужно сделать, это в основном поместить ключевое слово Union после первого from, скопировать select и from и вставить его, настроить логическую часть даты на то, что вы хотите, и сделать псевдонимы столбцов с одним и тем же именем. Вам нужно будет сделать это в течение того количества месяцев, которое вы хотите выбрать. order by будет вашим последним предложением во всем заявлении. Это будет немного небрежно, и, вероятно, есть другие способы добиться того, чего вы хотите, но, не зная, как настроена БД, трудно сказать.   -  person Timothy G.    schedule 23.05.2017
comment
спасибо Тимоти, я использую союз после каждого утверждения.   -  person Leo Fazzi    schedule 23.05.2017
comment
выберите подсчет бла-бла-бла из вызовов... объединить все, а затем выберите подсчет бла-бла-бла из вызовов. Я использую тот же псевдоним coulmn, но мне нужно уникальное имя для каждой строки...   -  person Leo Fazzi    schedule 23.05.2017


Ответы (1)


Имхо, вам лучше использовать GROUP BY для это:

select
  extract(month from c.call_start) as MyMonth,
  count(case when call_type='I' and cl.client_ID not like 391 then 1 else null end) as Incoming_Main, 
  count(case when call_type='O' and cl.client_ID not like 391 then 1 else null end) as Outgoing_Main,
  count(case when call_type='I' and cl.client_ID = 391        then 1 else null end) as Incoming_SMG,
  count(case when call_type='O' and cl.client_ID = 391        then 1 else null end) as Outgoing_SMG
from
  CALLS c 
  left outer join CONTACTS ct on c.CONTACT_ID= ct.CONTACT_ID
  left outer join clients cl on cl.client_id= ct.COMPANY_ID
where cl.RECORD_STATUS='A' 
  and c.OPERATOR_ID in (1510,2938,12443,4482,8911,6947,2056,1969,1952,2223,1511,2224,2039,2055,2085,1949,5963,1502,11112,1633,2034,2057)
  and extract(month from c.call_start) between 3 and 4 -- only return entries from March and April
group by
  extract(month from c.call_start)
order by
  count(call_type)

Обратите внимание, как я включил оценку EXTRACT() после select, where и group by.

person René Hoffmann    schedule 23.05.2017
comment
Привет, Рене! извлечь (месяц из c.call_start), поскольку месяц дает мне ошибку: динамическая ошибка sql код ошибки sql = -104 токен неизвестен - строка 2, символ 37 месяц - person Leo Fazzi; 23.05.2017
comment
Мне жаль! month — это зарезервированный идентификатор в Firebird. Вы должны дать столбцу другое имя или поместить его в кавычки. Я исправил свой ответ соответственно. - person René Hoffmann; 23.05.2017
comment
Интересный!!! так что, если я хочу с октября 2016 года по май 2017 года? не может сделать месяц `10 до 5, но может добавить или извлечь bla bla .. работает, но результат в каждой строке 10 5 11 12 2 1 - person Leo Fazzi; 23.05.2017
comment
Результат для какого столбца равен 10 5 11 12 2 1? Или это результат, который вы получаете для всех столбцов каждой строки? - person René Hoffmann; 23.05.2017
comment
10,11,12,1,2,3,4,5 был бы желаемым порядком.. еще лучше, если бы я мог позвонить 10 октября, 11 ноября .. но особо не беспокоился об этом - person Leo Fazzi; 23.05.2017
comment
Для этого вы можете добавить еще один столбец extract(year from c.call_start) as myYear. Затем вы бы group by и order by эти оба столбца. Это приведет к желаемому порядку. - person René Hoffmann; 23.05.2017
comment
Чтобы вывести названия месяцев, вы можете окружить оператор извлечения месяца оператором case, который возвращает имена для случаев с 1 по 12. - person René Hoffmann; 23.05.2017