Добрый день, уважаемые!

Можно ли с помощью Select Query реализовать такой запрос (интересует вложенность запросов):

SELECT "tbl_Contact"."Name" PersonalName, "tbl_CallType"."Name" TypeName, "tbl_CallResult"."Name" ResultName, "tbl_Contact"."DepartmentID", a.*
  FROM (
SELECT "tbl_Call"."CreatedByID", "DirectionID", "TypeID", "ResultID", COUNT(*) Quantity, MIN("TalkTime"), MAX("TalkTime"), AVG("TalkTime")
  FROM "tbl_Call"
 WHERE 1 = 1
   AND Trunc("tbl_Call"."CreatedOn") >= :fromdate
   AND Trunc("tbl_Call"."CreatedOn") = :todate
   AND nvl2(nullif("DirectionID",'0'),0,nvl2("ConnectionDate",0,1)) > 1
 GROUP BY "tbl_Call"."CreatedByID", "DirectionID", "TypeID", "ResultID"
UNION ALL
SELECT "tbl_Call"."CreatedByID", '2' "DirectionID", "TypeID", "ResultID", COUNT(*) Quantity, MIN("TalkTime"), MAX("TalkTime"), AVG("TalkTime")
  FROM "tbl_Call"
 WHERE 1 = 1
   AND Trunc("tbl_Call"."CreatedOn") >= :fromdate
   AND Trunc("tbl_Call"."CreatedOn") = :todate
   AND nvl2(nullif("DirectionID",'0'),0,nvl2("ConnectionDate",0,1)) = 1
 GROUP BY "tbl_Call"."CreatedByID", "DirectionID", "TypeID", "ResultID"
       ) a, "tbl_Contact", "tbl_CallResult", "tbl_CallType"
 WHERE 1 = 1
   AND a."CreatedByID" = "tbl_Contact"."ID"
   AND a."ResultID" = "tbl_CallResult"."ID" (+)
   AND a."TypeID" = "tbl_CallType"."ID" (+)
 ORDER BY "tbl_Contact"."Name", "DirectionID", "tbl_CallType"."Name", "tbl_CallResult"."Name"

Может есть другие варианты реализации?

Нравится

7 комментариев

Добрый день!

У меня была идея: http://community.terrasoft.ua/ideas/2763
Говорят, что:
Реализована в версии 3.3.2 начиная со сборки 3.3.2.72

По обходному - я свою проблему обошел через создание отдельного view http://community.terrasoft.ua/forum/topic/2693

Надеялся всё-таки что в моей версии 3.3.1.124 существует более цивилизованный способ, чем создание view. Ну что ж, спасибо, прийдется для создания каждого более-менее информативного отчёта поизголяться.
Попутный вопрос: а с UNION ALL дела тоже так плохо обстоят? Не смог я найти как сделать объединение двух запросов с помощью UNION (чтобы выбор был только уникальных записей, а не объединения всех).

можно попробовать такой вариант

SELECT a."CreatedByID",
a."DirectionID",
a."TypeID",
a."ResultID",
nvl2(nullif("DirectionID",'0'),0,nvl2("ConnectionDate",0,1)) as sss,
COUNT (*) Quantity,
MIN ("TalkTime"),
MAX ("TalkTime"),
AVG ("TalkTime")
FROM "tbl_Call" a,
"tbl_Contact" t,
"tbl_CallResult" m,
"tbl_CallType" p
WHERE 1 = 1
AND TRUNC (a."CreatedOn") >= :fromdate
AND TRUNC (a."CreatedOn") <= :todate
AND a."CreatedByID" = t."ID"
AND a."ResultID" = m."ID"(+)
AND a."TypeID" = p."ID"(+)
group BY a."CreatedByID",
a."DirectionID",
a."TypeID",
a."ResultID", nvl2(nullif(a."DirectionID",'0'),0,nvl2(a."ConnectionDate",0,1))

Денис, мысль верная. Только в строке

nvl2(nullif(a."DirectionID",'0'),0,nvl2(a."ConnectionDate",0,1))

необходимо было бы тогда писать

nvl2(nullif(a."DirectionID",'0'),1,nvl2(a."ConnectionDate",0,2))

для того, чтобы отделить пропущенны звонки. Но вся проблема заключается в том, что здесь мы тоже сталкиваемся с другим ограничением: по "Колонка с текстом SQL" не делается группировка в конечном запросе.

Удалось решить проблему с использованием ADODataset. Пишешь любой запрос руками и получаешь результат. Можно ли такое решение считать нормальным? Есть ли подводные камни, о которых я еще не догадываюсь?
PS. Один минус уже нашёл: в фильтре отчёта невозможно использовать ADODataset из-за того, что этот объект не поддерживает интерфейс IDBDataset.

пробуйте так

SELECT a."CreatedByID",
a."DirectionID",
a."TypeID",
a."ResultID",
1 as sss,
COUNT (*) Quantity,
MIN ("TalkTime"),
MAX ("TalkTime"),
AVG ("TalkTime")
FROM "tbl_Call" a,
"tbl_Contact" t,
"tbl_CallResult" m,
"tbl_CallType" p
WHERE 1 = 1
AND TRUNC (a."CreatedOn") >= :fromdate
AND TRUNC (a."CreatedOn") <= :todate
AND a."CreatedByID" = t."ID"
AND a."ResultID" = m."ID"(+)
AND a."TypeID" = p."ID"(+)
and nvl2(nullif(a."DirectionID",'0'),0,nvl2(a."ConnectionDate",0,1)) = 1

group BY a."CreatedByID",
a."DirectionID",
a."TypeID",
a."ResultID"
union all
SELECT a."CreatedByID",
a."DirectionID",
a."TypeID",
a."ResultID",
0 as sss,
COUNT (*) Quantity,
MIN ("TalkTime"),
MAX ("TalkTime"),
AVG ("TalkTime")
FROM "tbl_Call" a,
"tbl_Contact" t,
"tbl_CallResult" m,
"tbl_CallType" p
WHERE 1 = 1
AND TRUNC (a."CreatedOn") >= :fromdate
AND TRUNC (a."CreatedOn") <= :todate
AND a."CreatedByID" = t."ID"
AND a."ResultID" = m."ID"(+)
AND a."TypeID" = p."ID"(+)
and nvl2(nullif(a."DirectionID",'0'),0,nvl2(a."ConnectionDate",0,1)) = 0

group BY a."CreatedByID",
a."DirectionID",
a."TypeID",
a."ResultID"

хотя я бы и первый запрос засутул в сервис селекта

Да уж, ADODataset так и не удалось подключить к отчёту. То ли еще опыта маловато, то ли это невозможно. Воспользовавшись подсказкой Дениса разделил свой запрос на три части (хорошо что ограниченное количество вариантов) и загнал в админ. Спасибо.

Показать все комментарии