#mysql #sql
#mysql #sql
Вопрос:
Привет, ребята, у меня есть вопрос относительно объединения нескольких значений, которые входят в один столбец, разделенный запятой, как показано ниже.
Например, есть отчет, который извлекает данные, но для одного столбца есть 5 значений, поэтому из-за этого 5 раз одна и та же строка повторяется для всех столбцов, поэтому я хочу объединить все 5 значений для этого конкретного столбца.
пожалуйста, дайте мне знать, как я могу это сделать. ниже приведен запрос, который извлекает 5 значений, и я хочу, чтобы эти значения были в одной строке, разделенной только запятой.
SELECT PAC.PACKAGED_ITEM_GID
FROM SHIPMENT SH, ORDER_MOVEMENT OM,
ORDER_MOVEMENT_D OMD, S_SHIP_UNIT SSU, S_SHIP_UNIT_LINE SUL,
PACKAGED_ITEM PAC
WHERE OM.SHIPMENT_GID = SH.SHIPMENT_GID
AND OM.ORDER_MOVEMENT_GID = OMD.ORDER_MOVEMENT_GID
AND OMD.S_SHIP_UNIT_GID = SSU.S_SHIP_UNIT_GID
AND SSU.S_SHIP_UNIT_GID=SUL.S_SHIP_UNIT_GID
AND SUL.PACKAGED_ITEM_GID = PAC.PACKAGED_ITEM_GID
AND SH.SHIPMENT_GID = 'ULA/SAO.5000070143'
Комментарии:
1. `ВЫБЕРИТЕ PAC. PACKAGED_ITEM_GID ИЗ SHIPMENT SH, ORDER_MOVEMENT OM, ORDER_MOVEMENT_D OMD, S_SHIP_UNIT SSU, S_SHIP_UNIT_LINE SUL, PACKAGED_ITEM PAC, ГДЕ OM.SHIPMENT_GID = SH.SHIPMENT_GID И OM.ORDER_MOVEMENT_GID = OMD.ORDER_MOVEMENT_GID И OMD.S_SHIP_UNIT_GID = SSU. S_SHIP_UNIT_GID И SSU.S_SHIP_UNIT_GID=SUL.S_SHIP_UNIT_GID И SUL. PACKAGED_ITEM_GID = PAC. PACKAGED_ITEM_GID И SH.SHIPMENT_GID = ‘ULA/SAO.5000070143’
2. Предоставьте примеры данных, желаемые результаты и запрос, который вы используете, в тексте вопроса .
3. Спасибо, что изучили это, но я понял 🙂
4. ВЫБЕРИТЕ LISTAGG(PAC.PACKAGED_ITEM_GID , ‘,’) ВНУТРИ ГРУППЫ (ПОРЯДОК ПО ПАК. PACKAGED_ITEM_GID) ИЗ SHIPMENT SH, ORDER_MOVEMENT OM, ORDER_MOVEMENT_D OMD, S_SHIP_UNIT SSU, S_SHIP_UNIT_LINE SUL, PACKAGED_ITEM PAC, ГДЕ OM.SHIPMENT_GID = SH.SHIPMENT_GID И OM.ORDER_MOVEMENT_GID = OMD.ORDER_MOVEMENT_GID И OMD.S_SHIP_UNIT_GID = SSU .S_SHIP_UNIT_GID И SSU.S_SHIP_UNIT_GID=SUL.S_SHIP_UNIT_GID И SUL. PACKAGED_ITEM_GID = PAC. PACKAGED_ITEM_GID И SH.SHIPMENT_GID = ‘ULA/SAO.5000070143’
5. уведомления @otm: Почему эти запросы в разделе комментариев? Последний запрос для Oracle. Это не работает в MySQL.
Ответ №1:
Функция агрегирования строк MySQL является GROUP_CONCAT
.
Вы используете синтаксис соединения, который использовался в 1980-х годах. Почему? Где и когда вы этому научились? Вместо этого используйте правильные соединения ANSI:
SELECT GROUP_CONCAT(DISTINCT pac.packaged_item_gid) AS packaged_item_gids
FROM shipment sh
JOIN order_movement om ON om.shipment_gid = sh.shipment_gid
JOIN order_movement_d omd ON omd.order_movement_gid = om.order_movement_gid
JOIN s_ship_unit ssu ON ssu.s_ship_unit_gid = omd.s_ship_unit_gid
JOIN s_ship_unit_line sul ON sul.s_ship_unit_gid = ssu.s_ship_unit_gid
JOIN packaged_item pac ON pac.packaged_item_gid = sul.packaged_item_gid
WHERE sh.shipment_gid = 'ula/sao.5000070143';
Поскольку вы выбираете packaged_item_gid
единственное, которое доступно в s_ship_unit_line
, вы можете выбрать только из этой таблицы и посмотреть соответствующие поставки в IN
предложении.
SELECT GROUP_CONCAT(packaged_item_gid) as packaged_item_gids
FROM s_ship_unit_line
WHERE s_ship_unit_gid in
(
select ssu.s_ship_unit_gid
FROM shipment sh
JOIN order_movement om ON om.shipment_gid = sh.shipment_gid
JOIN order_movement_d omd ON omd.order_movement_gid = om.order_movement_gid
JOIN s_ship_unit ssu ON ssu.s_ship_unit_gid = omd.s_ship_unit_gid
WHERE sh.shipment_gid = 'ula/sao.5000070143'
);