MySQL - агрегирование и GROUP BY с подзапросами - PullRequest
0 голосов
/ 09 апреля 2020

Можно ли использовать GROUP BY для объединения ячеек с подзапросами? База данных, с которой я работаю, содержит информацию о заказе клиента (идентификатор заказа, имя, адрес, продукт, опция и т. Д. c). Когда клиент выбирает несколько вариантов для продукта, они появляются в отдельных строках. Мне нужно объединить все параметры продукта в одной строке, сопоставив их с новым столбцом, но я не уверен, куда добавить GROUP BY, поскольку у меня есть подзапросы ...

Вот запрос: http://sqlfiddle.com/#! 9 / 83a399 / 4/0

Ожидаемый результат:

Order ID | Qty | Option | Size | Product | Ref
-----------------------------------------------
12345    | 1   | R      | L    | Tee     | R / Tee L
12346    | 2   | Bl     | S    | Hood    | 2x Bl / Hood S

Ответы [ 2 ]

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

GROUP BY столбец с уникальными ключами и zse для остальных функции агрегирования Как и MAX в вашем случае

SELECT 
    `Order ID`, 
    `Qty`, 
    MAX(`Option`), 
    MAX(`Size`),
    `Product`,
        MAX(CONCAT (
            CASE 
                WHEN `Qty` > 1
                THEN CONCAT (`Qty`, 'x ')
                ELSE ''
                END,
            `Option`,
            ' / ',
            `Product`,
            CASE
                WHEN COALESCE (`Size`, '') != ''
                THEN CONCAT ('  ', `Size`)
                ELSE ''
                END
                ))
                AS `Ref`
    FROM (

        SELECT
            `order`.`order_id` AS `Order ID`,
            `order_product`.`quantity` AS `Qty`,

            CASE
                WHEN `order_option`.`value` LIKE '%Red%' THEN  'R'
                WHEN `order_option`.`value` LIKE '%Blue%' THEN  'Bl'
            END AS `Option`,

            CASE
                WHEN `order_product`.`name` LIKE '%t-shirt%' THEN 'Tee'
                WHEN `order_product`.`name` LIKE '%hoodie%' THEN 'Hood'
                ELSE `order_product`.`name`
            END AS `Product`,

            CASE        
                WHEN `order_option`.`value` LIKE '%Small%' THEN 'S'
                WHEN `order_option`.`value` LIKE '%Medium%' THEN  'M'
                WHEN `order_option`.`value` LIKE '%Large%' THEN  'L'

                ELSE ''
            END AS `Size`

    FROM
        `order`,
        `order_product`,
        `order_option`

    WHERE
        `order`.`order_id` = `order_option`.`order_id` AND 
        `order_product`.`order_product_id` = `order_option`.`order_product_id`

    ORDER BY `order`.`order_id` ASC

                ) AS `Orders`
 GROUP BY     
     `Order ID`, 
    `Qty`,
    `Product` ;

http://sqlfiddle.com/#! 9 / 83a399 / 6

0 голосов
/ 09 апреля 2020

Вы должны group by Order ID и агрегировать:

SELECT 
  `Order ID`, 
  MAX(`Qty`) AS `Qty`, 
  MAX(`Option`) AS `Option`, 
  MAX(`Size`) AS `Size`,
  MAX(`Product`) AS `Product`,
  CONCAT_WS(' ',  
    MAX(CONCAT(
      CASE WHEN `Qty` > 1 THEN CONCAT(`Qty`, 'x ') ELSE '' END,
      `Option`, ' / ', `Product`,
      CASE WHEN COALESCE(`Size`, '') != '' THEN CONCAT('  ', `Size`) ELSE '' END
    )),
    MAX(`Size`)
  ) AS `Ref`
FROM (
  SELECT  
    o.`order_id` AS `Order ID`,
    op.`quantity` AS `Qty`,
    CASE 
      WHEN oo.`value` LIKE '%Red%' THEN  'R'
      WHEN oo.`value` LIKE '%Blue%' THEN  'Bl'
    END AS `Option`,
    CASE
      WHEN op.`name` LIKE '%t-shirt%' THEN 'Tee'  
      WHEN op.`name` LIKE '%hoodie%' THEN 'Hood'
      ELSE op.`name`
    END AS `Product`,
    CASE
      WHEN oo.`value` LIKE '%Small%' THEN 'S'
      WHEN oo.`value` LIKE '%Medium%' THEN  'M'
      WHEN oo.`value` LIKE '%Large%' THEN  'L'
      ELSE ''
    END AS `Size`
  FROM `order` AS o
  INNER JOIN `order_option` AS oo ON o.`order_id` = oo.`order_id`
  INNER JOIN `order_product` AS op ON op.`order_product_id` = oo.`order_product_id`
) AS `Orders`
GROUP BY `Order ID`
ORDER BY `Order ID` DESC

Я внес изменения в ваш код, например, используя правильные объединения и псевдонимы для таблиц. Смотрите демо . Результаты:

| Order ID | Qty | Option | Size | Product | Ref            |
| -------- | --- | ------ | ---- | ------- | -------------- |
| 12346    | 2   | Bl     | S    | Hood    | 2x Bl / Hood S |
| 12345    | 1   | R      | L    | Tee     | R / Tee L      |
...