Как объединить несколько значений в sql

#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'
);