Как получить данные из разных строк одной таблицы на основе разных критериев - PullRequest
2 голосов
/ 27 января 2012

Я пытаюсь написать простой SQL-оператор для построения отчета Oracle, но я застрял в какой-то момент. Таблица x_request содержит сделанные запросы, а различные задачи, связанные с выполненными конкретными запросами, хранятся в x_request_work_log . Подведем итог структуры этих таблиц:

X_request

-id  
-name
-requester
-request_date

x_request_work_log

-id
-request_id (foreign key)
-taskId
-start_date
-end_date

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

x_request

id    name      requester    request_date
1     firstReq  John         01/01/2012
2     secondReq Steve        21/01/2012

x_request_work_log

id    requestId    taskId    startDate     endDate
1     1            0         01/01/2012    03/01/2012
2     1            1         04/01/2012    04/01/2012
3     1            2         05/01/2012    15/01/2012
4     2            0         24/01/2012    02/02/2012

Шаблон моего отчета следующий:

requestName    timeSpent(task(0))    timeSpent(task(1))     timeSpent(task(2)) 
|          |   |                 |   |                |     |                |

Итак, вот где я застрял. Мне нужен оператор Sql Select, который будет возвращать каждую строку в отформатированном виде, как описано выше. Как я могу получить и отобразить даты начала и окончания различных задач. Btw timeSpent = endDate (task (x)) - startDate (task (x))

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

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Звучит так, будто вы просто хотите что-то вроде

SELECT r.name request_name,
       SUM( (CASE WHEN l.taskId = 0 
                  THEN l.endDate - l.StartDate
                  ELSE 0
               END) ) task0_time_spent,
       SUM( (CASE WHEN l.taskId = 1 
                  THEN l.endDate - l.StartDate
                  ELSE 0
               END) ) task1_time_spent,
       SUM( (CASE WHEN l.taskId = 2 
                  THEN l.endDate - l.StartDate
                  ELSE 0
               END) ) task2_time_spent
  FROM x_request_work_log l
       JOIN x_request r ON (l.requestId = r.Id)
 GROUP BY r.name

Если вы используете 11g, вы также можете использовать оператор PIVOT.

0 голосов
/ 27 января 2012

Если вам нужно отобразить всех членов группы в одной строке, вы можете сделать это в MySQL с помощью оператора GROUP_CONCAT (я не знаю, каков эквивалент в Oracle):

> SELECT requestID,
         GROUP_CONCAT(DATEDIFF(endDate,startDate)) AS length
  FROM request_work_log
  GROUP BY requestId;

+-----------+--------+
| requestID | length |
+-----------+--------+
|         1 | 2,0,10 |
|         2 | 9      |
+-----------+--------+

(а затем добавить внутреннее соединение к другой таблице, чтобы заменить requestID именем запроса)

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