сводная таблица с двумя строками в столбцы - PullRequest
0 голосов
/ 08 апреля 2020

у меня есть следующий результат для моей таблицы:

our_date | number_people
------------------------
23/09/19 |  26
24/09/19 |  26

ВСЕГДА будет всего две строки

, и я хочу повернуть этот результат и получить это:

our_date_1   | number_people_1   | our_date_2   | number_people_2
-----------------------------------------------------------------
23/09/19     |  26               | 24/09/19     |   26

, чтобы получить разницу между number_people_1 и number_people_2

Я пытаюсь:

select *
from table_1
pivot(
    count(number_people)
    for our_date in (:P_TODAY, :P_YESTERDAY)
)

и это моя настоящая ошибка:

ORA-56900: la variable de enlace no está soportada en la operación PIVOT|UNPIVOT
56900. 0000 -  "bind variable is not supported inside pivot|unpivot operation"
*Cause:    Attempted to use bind variables inside pivot|unpivot operation.
*Action:   This is not supported.

что не так? как я могу использовать динамические c значения внутри для предложения?

С уважением

1 Ответ

1 голос
/ 08 апреля 2020

Ошибка говорит, что это:

for fecha in (our_date)

не может иметь our_date (имя столбца) как список значений ; он (список ) должен содержать константы, например,

for our_date in (date '2019-09-23', date '2019-09-24')

Как только вы это исправите, запрос может выглядеть следующим образом:

SQL> with table_1 (our_date, number_people) as
  2    (select date '2019-09-23', 26 from dual union all
  3     select date '2019-09-24', 26 from dual
  4    )
  5  select *
  6  from table_1
  7  pivot (max(number_people)
  8         for our_date in (date '2019-09-23', date '2019-09-24')
  9        );

TO_DATE(' 2019-09-23 00:00:00' TO_DATE(' 2019-09-24 00:00:00'
------------------------------ ------------------------------
                            26                             26

SQL>

Но , это не совсем то, что вы хотели.

Что, если в этой таблице 3, 4 или более строк? Возможно ли это, или всегда будет только 2 строки?


Если это всегда только 2 строки, самостоятельное соединение может сделать эту работу. Например:

SQL> with table_1 (our_date, number_people) as
  2    (select date '2019-09-23', 26 from dual union all
  3     select date '2019-09-24', 22 from dual
  4    ),
  5  temp as
  6    (select our_date, number_people,
  7       row_number() over (order by our_date) rn
  8     from table_1
  9    )
 10  select
 11    a.our_date our_date_1,
 12    a.number_people number_people_1,
 13    --
 14    b.our_date our_date_2,
 15    b.number_people number_people_2
 16  from temp a cross join temp b
 17  where a.rn = 1
 18    and b.rn = 2;

OUR_DATE_1 NUMBER_PEOPLE_1 OUR_DATE_2 NUMBER_PEOPLE_2
---------- --------------- ---------- ---------------
23.09.2019              26 24.09.2019              22

SQL>
...