webForumDet fria alternativet

Ett urval med MIN av en kolumn?

Databaser & SQL

6 svar · 989 visningar · startad av evilaid

Medlem sedan apr. 2009433 inlägg
Frågan#1

Vet inte om det är möjligt men jag tänker så här..
om jag gör ett urval och i detta urval finns det en kolumn som heter prodplan_id. Nu vill jag få till så att alla rader väljs där det lägsta prodplan_id väljs..

Alltså urvalet av frågan kanske resulterar i hundra rader, utav dessa har hälften av rederna ett prodplan_id och resterande ett annat.. Nu vill jag få ut dom 50 som har det lägsta av dom två prodplan_id'ena..
Trodde man kunde använda MIN eller liknande, men fick inte ut något av det..

Frågan ser ut så här nu om det är till någon hjälp:

SELECT oe.id AS oeID, oh.ordernumber, oe.order_line, oe.prod_week, oe.prodplan_id, oe.door_type, oe.amount AS amountOfDoors, oe.inner_color, 
oe.outer_color, oe.prod_week, a.name, a.description, i.amount AS iAmount, md.status AS mdStatus, i.width, i.length, c.color_name AS innerColor, 
c2.color_name AS outerColor, pp.status, oe.pos, d.name, md.id AS mdid FROM pd_mounting_details AS md 
LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id 
LEFT OUTER JOIN pd_article AS a ON md.article = a.id 
LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id 
LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id 
LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id 
LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id 
LEFT OUTER JOIN pd_doors as d ON oe.door=d.id 
LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id 
WHERE (a.production_group = 4) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and md.status =4 and (startTime ='' OR startTime is null) 
AND (stopTime ='' or stopTime is null) ORDER BY oe.pos

Tack på förhand

Mvh

Medlem sedan dec. 201027 inlägg
#2

SELECT TOP 50 * FROM (SELECT oe.id AS oeID, oh.ordernumber, oe.order_line, oe.prod_week, oe.prodplan_id, oe.door_type, oe.amount AS amountOfDoors, oe.inner_color,
oe.outer_color, oe.prod_week, a.name, a.description, i.amount AS iAmount, md.status AS mdStatus, i.width, i.length, c.color_name AS innerColor,
c2.color_name AS outerColor, pp.status, oe.pos, d.name, md.id AS mdid FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id
LEFT OUTER JOIN pd_article AS a ON md.article = a.id
LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id
LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id
LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id
LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id
LEFT OUTER JOIN pd_doors as d ON oe.door=d.id
LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id
WHERE (a.production_group = 4) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and md.status =4 and (startTime ='' OR startTime is null)
AND (stopTime ='' or stopTime is null)) as drv
ORDER BY drv.prodplan_id

Enkelt och smidigt dock en extra select men borde funka? Eller har jag förstått dig fel =)

Medlem sedan apr. 2009433 inlägg
#3

alltså, n var jag nog lite otydlig... Det var bara ett exmpel med just 50. .Jag vet aldrig hur många rader det är utan vill bara får ut alla dom rader som innehåller just det lägsta id'et?

Medlem sedan dec. 201027 inlägg
#4

Jaha okej.. Du kan göra som nedan exempel. Problemet är att frågan blir lite tung. Du kanske inte behöver joina in så mycket för att få ut det lägsta oe.prodplan-id:t? Och kanske du inte behöver du inte joina in så mycket för att få fram datan du vill ha när du redan vet oe.prodplan_id:t. Då blir inte frågan sååå jobbig. Jag skulle inte göra på detta vis om den kördes ofta.

Du skulle nog kunna köra en "WITH CTE" fråga också. Lite svårt när man inte har tabellerna framför sig så man kan testa bara.

SELECT oe.id AS oeID, oh.ordernumber, oe.order_line, oe.prod_week, oe.prodplan_id, oe.door_type, oe.amount AS amountOfDoors, oe.inner_color,
oe.outer_color, oe.prod_week, a.name, a.description, i.amount AS iAmount, md.status AS mdStatus, i.width, i.length, c.color_name AS innerColor,
c2.color_name AS outerColor, pp.status, oe.pos, d.name, md.id AS mdid FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id
LEFT OUTER JOIN pd_article AS a ON md.article = a.id
LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id
LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id
LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id
LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id
LEFT OUTER JOIN pd_doors as d ON oe.door=d.id
LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id
WHERE (a.production_group = 4) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and md.status =4 and (startTime ='' OR startTime is null)
AND (stopTime ='' or stopTime is null)
AND oe.prodplan_id = (SELECT MIN(oe.prodplan_id) FROM etc....joins...)
ORDER BY oe.pos

Medlem sedan apr. 2009433 inlägg
#5

nja, jag behöver nog få med dom kolumner som jag har där.. Som min fråga ser ut nu. Anses den var "tung"..

Vet inte om jag dragit det för långt med att använda flera tabeller då jag inte vill repeterar för mycket?

Medlem sedan dec. 201027 inlägg
#6

Jo men det får du om du gör som mitt exempel. Alltså alla kolumner.

Såhär fast nu är den inte "optimerad"

SELECT oe.id AS oeID, oh.ordernumber, oe.order_line, oe.prod_week, oe.prodplan_id, oe.door_type, oe.amount AS amountOfDoors, oe.inner_color,
oe.outer_color, oe.prod_week, a.name, a.description, i.amount AS iAmount, md.status AS mdStatus, i.width, i.length, c.color_name AS innerColor,
c2.color_name AS outerColor, pp.status, oe.pos, d.name, md.id AS mdid FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id
LEFT OUTER JOIN pd_article AS a ON md.article = a.id
LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id
LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id
LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id
LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id
LEFT OUTER JOIN pd_doors as d ON oe.door=d.id
LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id
WHERE (a.production_group = 4) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and md.status =4 and (startTime ='' OR startTime is null)
AND (stopTime ='' or stopTime is null)
AND oe.prodplan_id = (SELECT MIN(oe.prodplan_id) FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id
LEFT OUTER JOIN pd_article AS a ON md.article = a.id
LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id
LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id
LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id
LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id
LEFT OUTER JOIN pd_doors as d ON oe.door=d.id
LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id
WHERE (a.production_group = 4) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and md.status =4 and (startTime ='' OR startTime is null)
AND (stopTime ='' or stopTime is null))
ORDER BY oe.pos

Medlem sedan apr. 2009433 inlägg
#7

A klockrent.. NU fungerar det..
Men det gick korta ner till:

SELECT oe.id AS oeID, oh.ordernumber, oe.order_line, oe.prod_week, oe.prodplan_id, oe.door_type, oe.amount AS amountOfDoors, oe.inner_color,
oe.outer_color, oe.prod_week, a.name, a.description, i.amount AS iAmount, md.status AS mdStatus, i.width, i.length, c.color_name AS innerColor,
c2.color_name AS outerColor, pp.status, oe.pos, d.name, md.id AS mdid FROM pd_mounting_details AS md
LEFT OUTER JOIN pd_order_eco AS oe ON md.order_data = oe.id
LEFT OUTER JOIN pd_article AS a ON md.article = a.id
LEFT OUTER JOIN pd_inventory AS i ON md.id = i.pp_id
LEFT OUTER JOIN pd_order_head AS oh ON oe.order_head = oh.id
LEFT OUTER JOIN pd_colors AS c ON oe.inner_color = c.id
LEFT OUTER JOIN pd_colors AS c2 ON oe.outer_color = c2.id
LEFT OUTER JOIN pd_doors as d ON oe.door=d.id
LEFT OUTER JOIN pd_production_plan AS pp ON oe.prodplan_id = pp.id
WHERE (a.production_group = 4) AND (NOT (oe.amount = 0)) AND (pp.status = 4) and md.status =4 and (startTime ='' OR startTime is null)
AND (stopTime ='' or stopTime is null)
AND oe.prodplan_id = (SELECT MIN(oe.prodplan_id) from pd_order_eco) ORDER BY oe.pos
266 ms totalt · 3 externa anrop · v20260731065814-full.a4a6ad0e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)