PL/SQL-Как реализовать несколько операторов подсчета в одном запросе, когда таблицы и условия все разные

Я работаю над инструментом Open Text Content Server, который использует базу данных PL/SQL. То, что я пытаюсь сделать, - это получить данные подсчета через 6 разных запросов, каждый из которых имеет разные условия и разные таблицы. Я пытался объединить все эти 6 запросов, но не повезло. Ниже перечислены эти 6 запросов:

Документы, созданные за месяц:

select count (dataid) from Dtree where 
Createdate >= %1 and createdate <= %2 and subtype = 144

Общее количество пользователей:

select count(a.id) from Kuaf a, kuaf b where 
a.deleted =0 and a.type =0 and b.id = a.groupid

Количество уникальных пользователей, зарегистрировавшихся за месяц (количество):

Select count (distinct (performerID))
from dauditnew where auditid=23 and auditdate >= %1 and auditdate <= %2

Пользователи, созданные за месяц (кол-во):

Select Count(dataid) FROM DAUDITNEW where AUDITID = 1 
AND AUDITSTR LIKE 'Create' and subtype=142 AND 
auditdate >= %1 and auditdate <= %2

Удаленные пользователи (количество):

SELECT count(a.userid) from dauditnew a WHERE
a.auditstr = 'Delete' AND 
a.AuditDate >= %1 AND 
a.AuditDate <= %2 AND 
a.UserID in (Select ID from KUAF where Deleted = 1 and Type=0)

Инициированные рабочие процессы:

Select count(*) from Wworkaudit WWA where WWA.workaudit_status=1 AND 
WWA.workaudit_date >= %1 and WWA.workaudit_date <= %2

Здесь%1,%2 обозначают пользовательский ввод. Поскольку все эти 6 запросов имеют совершенно разные условия, мне кажется сложной задачей их объединить. Пожалуйста, помогите мне.

Благодарю вас.

2 ответа

Решение
SELECT (
         select count (dataid)
         from   Dtree
         where  Createdate BETWEEN :start_date and :end_date
         and    subtype = 144
       ) AS Docs_Per_Month,
       (
         select count(a.id)
         from   Kuaf a INNER JOIN kuaf b ON (b.id = a.groupid)
         where  a.deleted = 0
         and    a.type    = 0
       ) AS Total_No_of_Users,
       (
         Select count( distinct performerID )
         from   dauditnew
         where  auditid = 23
         and    auditdate BETWEEN :start_date and :end_date
       ) AS Unique_Users_in_Month,
       (
         Select Count(dataid)
         FROM   DAUDITNEW
         where  AUDITID  = 1 
         AND    AUDITSTR = 'Create'
         and    subtype  = 142
         AND    auditdate BETWEEN :start_date and :end_date
       ) AS Users_Created_in_Month,
       (
         SELECT count(a.userid)
         from   dauditnew a
         WHERE  a.auditstr = 'Delete'
         AND    a.auditdate BETWEEN :start_date and :end_date
         AND    a.UserID in (Select ID from KUAF where Deleted = 1 and Type=0)
       ) AS Users_Deleted,
       (
         Select count(*)
         from   Wworkaudit
         where  workaudit_status = 1
         AND    workaudit_date BETWEEN :start_date and :end_date
       ) AS Workflows_Initiated
FROM   DUAL;

Используйте оператор UNION ALL

Ex. выберите количество (ось) из a... где... UNION ALL выберите количество (bz) из b... где... UNION ALL выберите количество (cy) из c... где... и т. д.

Примечание: вы должны использовать UNION ALL, потому что если вы используете обычный UNION, дублированные результаты не будут отображаться

Другие вопросы по тегам