MySQL: GROUP BY - PullRequest
       7

MySQL: GROUP BY

0 голосов
/ 04 мая 2018

Я хотел бы сгруппировать по m.ID и иметь СУММУ (pm.amount_construction * prod.anzahl) для каждого m.id

На самом деле у меня следующий результат:

Meterial_id | amount_construction | Anzahl_der_productionen | Total_amount
---------------------------------------------------------------------------
181         | 1                   | 10                      | 10
181         | 2                   | 20                      | 40
181         | 1                   | 100                     | 100
182         | 1                   | 10                      | 10
182         | 1                   | 20                      | 20
183         | 1                   | 100                     | 100
283         | 1                   | 5                       | 5
283         | 1                   | 10                      | 10
283         | 2                   | 100                     | 200
283         | 10                  | 55                      | 550

Мне нужно следующее (столбцы 2 и 3 не нужны)

Meterial_id | Total_amount
---------------------------
181         | 150
182         | 30 
183         | 100
283         | 765

Я пытался Group By m.id и сделал sum(pm.amount_construction * prod.anzahl) но я получил странные результаты

Пожалуйста, смотрите мой код ниже:

SELECT
m.id As Meterial_id,    
pm.amount_construction AS amount_construction,    
prod.anzahl as Anzahl_der_productionen,    
(pm.amount_construction* prod.anzahl) as Total_amount

FROM produktion prod
JOIN projekt p    
   ON prod.projekt = p.id
JOIN kunden k    
   ON k.id = p.kunde
   LEFT JOIN bauteil b    
      ON b.produktion = prod.id    
JOIN product_material pm
JOIN material m    
   ON m.id = pm.material_id
JOIN product_configurationelement pce    
   ON pce.id = pm.product_configurationelement_id    
JOIN product_configurationelement_value pcev    
   ON pcev.product_configurationelement_id = pm.product_configurationelement_id    
   AND pcev.value_nr = pm.value_nr
JOIN product_type  pt
JOIN produkt pd
   ON pd.id = prod.produkt
JOIN product_generation pg
   ON pg.product_type_id = pt.id
JOIN product_modification pmm
   ON pmm.product_generation_id = pg.id
WHERE (prod.anzahl > 0 and pt.id = pd.product_type_id AND pm.product_generation_id = pd.product_generation_id  AND pg.generation = pd.generation AND p.starttermin <= '2018-07-05')    
ORDER BY m.id

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Многие присоединяются. Некоторые из них являются недействительными. JOIN является сокращением от INNER JOIN и нуждается в предложении ON или USING. MySQL, однако, тихо преобразует JOIN в CROSS JOIN, когда вы забываете предложение. Это может привести к ужасным ошибкам, но у вас есть скрытые критерии в вашем предложении WHERE, поэтому, насколько я вижу, все таблицы объединены правильно.

Во всяком случае, многие объединения не нужны. Зачем присоединяться к bauteil например? Может быть много bauteil на produktion, поэтому вы умножаете результат на количество сотен. То же самое с product_configurationelement, product_configurationelement_value, product_generation и product_modification Я думаю. Тогда есть лишние объединения к kunden, produkt и т. Д.

Если я не ошибаюсь, это именно то, что вам нужно: все product_material объединены с produktion с проектом, соответствующим диапазону дат, сгруппированным по material_id, чтобы получить по одной строке результатов на материал.

SELECT
  pm.material_id,    
  SUM(pm.amount_construction * produktion.anzahl) as total_amount
FROM product_material pm
JOIN produkt p ON p.product_generation_id = pm.product_generation_id
JOIN produktion ON produktion.produkt = p.id and produktion.anzahl > 0
WHERE produktion.projekt IN (SELECT id FROM projekt WHERE starttermin <= date '2018-07-05')
GROUP BY pm.material_id
ORDER BY pm.material_id;
0 голосов
/ 04 мая 2018

Похоже, вы забыли GROUP BY, но это может быть опечаткой, и у вашего запроса есть другие проблемы. Любое неагрегированное, не сгруппированное поле в агрегирующем запросе будет иметь фактически случайное значение из значений, обнаруженных для этого поля в сгруппированном наборе значений. Таким образом, если pm и prod не равны 1: 1 с m.id, вы получите непредсказуемые значения, которые могут измениться от одного выполнения запроса к следующему.

Большинство СУБД даже не разрешают такой запрос, и последние конфигурации MySql по умолчанию отключают эту возможность.

0 голосов
/ 04 мая 2018

Попробуйте, вы получите ожидаемый результат

SELECT
m.id As Meterial_id,    
sum(pm.amount_construction* prod.anzahl) as Total_amount
FROM produktion prod
JOIN projekt p    
   ON prod.projekt = p.id
JOIN kunden k    
   ON k.id = p.kunde
   LEFT JOIN bauteil b    
      ON b.produktion = prod.id    
JOIN product_material pm
JOIN material m    
   ON m.id = pm.material_id
JOIN product_configurationelement pce    
   ON pce.id = pm.product_configurationelement_id    
JOIN product_configurationelement_value pcev    
   ON pcev.product_configurationelement_id = pm.product_configurationelement_id    
   AND pcev.value_nr = pm.value_nr
JOIN product_type  pt
JOIN produkt pd
   ON pd.id = prod.produkt
JOIN product_generation pg
   ON pg.product_type_id = pt.id
JOIN product_modification pmm
   ON pmm.product_generation_id = pg.id
WHERE (prod.anzahl > 0 and pt.id = pd.product_type_id AND pm.product_generation_id = pd.product_generation_id  AND pg.generation = pd.generation AND p.starttermin <= '2018-07-05')
group by m.id    
ORDER BY m.id
0 голосов
/ 04 мая 2018

А как же:

SELECT
    m.id As Meterial_id,    
    sum(pm.amount_construction* prod.anzahl)

FROM 
    ....
GROUP BY m.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...