planetz Ответов: 1

Сводные данные в день или неделю или месяц оракул мудрый мудрый мудрый


Всем Привет,

Я не смог объяснить свою проблему в своем последнем вопросе, поэтому я публикую новый вопрос.


У меня есть столик:

ename | edate
emp1 / 01-10-17
emp1 / 01-10-17
emp1 / 01-10-17
emp1 / 02-10-17
emp2 / 01-10-17
emp3 / 01-10-17
emp3 / 01-10-17
emp3 / 02-10-17
emp3 / 02-10-17


Ожидаемый результат после поворота:
эмаль кулон | 01-10-17 | 02-10-17
emp1 / 3 / 1
emp2 / 1 / 0
emp3 / 2 / 2

и есть условие, что счет за каждый день должен быть больше 1.

Так что окончательный выход есть
эмаль кулон | 01-10-17 | 02-10-17
emp3 / 2 / 2

как только Эми 3 Количество дней более чем в 1.

Я использовал pivot в oracle 11g. Но на самом деле этот запрос будет выполняться на 10g, и я обнаружил, что pivot не поддерживается в 10g.

Что я уже пробовал:

В oracle 11g,

ВЫБЕРИТЕ * ИЗ
(
Выберите ename, edate
От tblName
)
СТЕРЖЕНЬ
(
Граф (edate)
Для edate in ('01-oct-2017', '02-oct-2017')
)
Заказ на эмаль кулон;

Но я не могу найти способ добавить условие "> 1", а также теперь я набрал даты вручную, но в реальной ситуации они могут быть любыми несколькими датами.

1 Ответов

Рейтинг:
2

Maciej Los

[РЕДАКТИРОВАТЬ]
Если вы хотите получить только те данные, где количество больше 1, Вы можете использовать предложение HAVING[^] чтобы ограничить результирующий набор в качестве источника pivot.

SELECT ename, edate, COUNT(*) AS CountOfDates
FROM tblName
GROUP BY ename, edate
HAVING COUNT(*)>1


Что касается вашего второго вопроса: есть способ создать сводную таблицу без ввода дат: Динамический pivot в oracle sql-Stack Overflow[^]
Итак, я бы попробовал (но я не установил Oracle server) улучшить ссылочные операторы sql:
clear columns
COLUMN temp_in_statement new_value str_in_statement
SELECT DISTINCT 
    LISTAGG('''' || edate || ''' AS ' || edate,',')
        WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement 
    FROM (SELECT DISTINCT edate FROM tblName);

--this should put a list of dates in format: <code>'01-Oct-2017' as 01-Oct-2017</code> and so on...  into a variable

SELECT *
FROM (
    SELECT ename, edate, COUNT(*) AS CountOfDates
    FROM tblName
    GROUP BY ename, edate
    HAVING COUNT(*)>1
)
PIVOT (Sum(CountOfDates) AS val FOR edate IN (&str_in_statement));


Примечание: Однако есть ограничения: Вы можете объединить только строку размером до 4000 байт.

Для получения более подробной информации, пожалуйста, смотрите:
Параметр Oracle SQL * PLUS new_value[^]
Справочник команд, 14 из 52[^]


planetz

Я должен показать отдельные даты как отдельные имена столбцов и их соответствующий подсчет под ними.

Maciej Los

Проверьте улучшенный ответ.

planetz

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

эмаль кулон | 01-10-17 | 02-10-17
emp3 / 2 / 2

Но с вашими запросами это как:

эмаль кулон | 01-10-17 | 02-10-17
emp3 / 2 / 2
emp1 / 3 / null

Maciej Los

Ну и что? Вам нужно добавить еще одно условие. Подумай об этом и попробуй.
Если мой ответ был полезен, пожалуйста, примите его (зеленая кнопка).