Как часть моего SQL-запроса, я сначала создаю таблицу с именем «new» на основе определенных условий, а затем insert into
new
таблица некоторых столбцов из другой таблицы old
на основе определенных условий. Вот упрощенная версия того, что я пытаюсь сделать:
item | subitem | stage | id |
-----------------------------------------------
i1 | s1 | picked | 1 |
i1 | s2 | shipped | 1 |
i2 | s4 | picked | 2 |
i3 | s10 | shipped | 2 |
i3 | s11 | eligible | 0 |
i4 | s2 |not eligible| 0 |
i1 | s1 | picked | 3 |
i1 | s2 | picked | 3 |
Я хочу получить следующий вывод:
item1|subitem1|item2|subitem2|pair_volume|item1pick|item1ship|item2pick|item2ship|
-------------------------------------------------------------------------------------
i1 | s1 | i1 | s2 | 2 | 2 | 0 | 2 | 1 |
i1 | s1 | i2 | s4 | 1 |1 | 0 | 1 | 1 |
....
.....
....
По сути, я хочу сделать следующее:
Я хочу сначала сделать перекрестное соединение item, subitem
с самим собой, поэтому у меня есть все возможные комбинации item1
, subitem1
и item2
, subitem2
.
Вот как определяются этапы. Если стадия является приемлемой, то она является приемлемой, тогда как если стадия выбрана, то это означает, что элемент является приемлемым и выбранным. Если этап доставлен, это означает, что предмет имеет право, выбран и доставлен. Упоминается только последний этап.
Теперь для каждой пары item1, subitem1 - item2, subitem2
я хочу рассчитать количество id
сеансов, где эта пара встречается и имеет этап в (eligible, shipped, picked)
, и заполнить значение в pair_volume
. Например, пара (i1,s1)-(i1,s2)
встречается дважды (один раз в id
1 и один раз в id
3), и в обеих этих id
сессиях оба элемента в паре были eligible
(что подразумевается из picked
и shipped
) этапы. Из 2 раз, когда эта подходящая пара встречалась, сколько раз было выбрано item1, item2 поднято, item1 отправлено и item2 отправлено? Это то, что я пытаюсь решить.
У меня все хорошо, пока не кросс-соединение. Но я не знаю, как вставить значения в таблицу перекрестных соединений. Реальная проблема более сложна, чем я упомянул здесь. Любая помощь высоко ценится!
Вот такой у меня запрос:
with new as
(
select combination.item1, combination.subitem1, combination.item2,
combination.subitem2,
(
select tmp.item1, tmp.subitem1, tmp.item2, tmp.subitem2,
case when ((tmp.item1 = tmp.item2) and
(tmp.subitem1 = tmp.subitem2)) then 'TRUE' else
'FALSE' end as indicator from
(
select distinct item as item1, subitem as subitem2
from old
cross join
select distinct item as item2, subitem as subitem2
from old
) tmp
) combination
where combination.indicator = 'FALSE'
)
insert into new (pair_volume)
select count(id) as pair_volume
from old
where ((new.item1 = old.item) and (new.subitem1 = old.subitem) and
stage
in ('picked', 'eligible', 'shipped')) and
((new.item2 = old.item) and (new.subitem2 = old.subitem) and
stage
in ('picked', 'eligible', 'shipped')
Это, по сути, то, что я пытаюсь сделать здесь, и оператор insert into
продолжает выдавать ошибку. Партия до cross join
работает нормально. Но у меня возникают проблемы при вставке значений в таблицу, а также при создании правильных условий для выходной таблицы, которую я хочу. Любая помощь очень ценится !!
Однако, это выдает ошибку для меня следующим образом:
Ошибка компиляции SQL: синтаксическая ошибка, строка 4 в позиции 0, неожиданная «вставка».
Я пытался включить точку с запятой перед оператором insert into
, вот что я получаю:
Ошибка компиляции SQL: строка синтаксической ошибки 3 в позиции 1 неожиданно ';'.
Я пытался добавить запятую ,
перед оператором insert into
, вот что я получаю:
Ошибка компиляции SQL: синтаксическая ошибка, строка 4 в позиции 0, неожиданная «вставка». Синтаксическая ошибка строки 5 в позиции 0 неожиданного «выбора».
Что я здесь не так делаю? Основываясь на множестве других постов, я решил, что именно так мы используем insert into
с CTE.