Добрый день, уважаемые!
Можно ли с помощью Select Query реализовать такой запрос (интересует вложенность запросов):
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"
Может есть другие варианты реализации?
Нравится
Добрый день!
У меня была идея: 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"
хотя я бы и первый запрос засутул в сервис селекта