Объединить данные из нескольких строк, используя sum () over (Partion by) в MySQL - PullRequest
0 голосов
/ 11 июля 2019
SELECT orders.Stock ,lflayouts.sides, count(*) as Quantity FROM dash_relationship 
JOIN orders ON orders.UID = dash_relationship.form_id
JOIN lfitems ON lfitems.uid = orders.UID
Join lflayouts ON lflayouts.id = lfitems.layout_id
WHERE dash_relationship.machine_id='108'
GROUP BY orders.stock,lflayouts.sides;

Вышеприведенный запрос выводит следующее

STOCK   SIDES    QUANTITY
paper1    1         214
paper1    2         210
paper2    1           7
paper3    1           2

Теперь мой вопрос: что, если я хочу получить общее количество отдельных акций с разных сторон? Поэтому я попытался использовать приведенный ниже запрос, и он выдал ошибку, указав версию сервера для правильного синтаксиса для использования рядом с '(раздел) в строке 1

SELECT orders.Stock ,lflayouts.sides, count(*) as Quantity, SUM(lflayouts.sides) OVER(partition by orders.stock) as Total FROM dash_relationship 
JOIN orders ON orders.UID = dash_relationship.form_id
JOIN lfitems ON lfitems.uid = orders.UID
Join lflayouts ON lflayouts.id = lfitems.layout_id
WHERE dash_relationship.machine_id='108'
GROUP BY orders.stock,lflayouts.sides;

EXPECTED OUTPUT
STOCK   SIDES    QUANTITY TOTAL
paper1    1         214    414 or 214
paper1    2         210    414
paper2    1           7      7
paper3    1           2      2

1 Ответ

1 голос
/ 11 июля 2019

MySQL 5.5.62 не поддерживает оконные функции.

Вы можете использовать стандартное объединение для достижения этого, но запрос будет выглядеть более сложным.

SELECT    T1.Stock
         ,T1.sides
         ,Sum(T2.Quantity) as RunningTotal
FROM     (SELECT orders.Stock ,lflayouts.sides, count(*) as Quantity 
          FROM 
              dash_relationship 
              JOIN orders ON orders.UID = dash_relationship.form_id
              JOIN lfitems ON lfitems.uid = orders.UID
              JOIN lflayouts ON lflayouts.id = lfitems.layout_id
              WHERE dash_relationship.machine_id='108'
              GROUP BY orders.stock,lflayouts.sides
         ) T1
         INNER JOIN 
         (
          SELECT orders.Stock ,lflayouts.sides, count(*) as Quantity 
          FROM 
              dash_relationship 
              JOIN orders ON orders.UID = dash_relationship.form_id
              JOIN lfitems ON lfitems.uid = orders.UID
              JOIN lflayouts ON lflayouts.id = lfitems.layout_id
              WHERE dash_relationship.machine_id='108'
              GROUP BY orders.stock,lflayouts.sides
         ) T2
         ON   T1.sides >= T2.sides
         AND  T1.Stock = T2.Stock
GROUP BY  T1.Stock
         ,T1.sides
Order BY  T1.Stock
         ,T1.sides
...