19. maj 2008 - 14:29Der er
9 kommentarer og 1 løsning
Hjælp til forespørsel (og group by)
Først, undskyld denne kæmpe post, men der skal være nogle data at se på. Jeg synes også at det er svært at stille spørgsmålet op så der ikke opstår flere spørgsmål.
Resultatlisten skal kun vise linier fra de seneste 25 linier i tabellen TilLagerNu hvor M_ID=16 (i dette eksempel) Skal grupereres efter lornummer Rækkefølgen på grupperne skal være: Finde første datotid blandt de lotnumre der figurer blandt de seneste 25 i listen. Skrive summen af gram for hver lotnr. (her skal den totale sum sammenregnes for lotnummeret, også selv om kun de 2 linier er bland de 25 liner på listen)
Kan mit ønske laves via sql alene? Jeg kan selv flække nogle simple sql sætninger sammen, men denne kan jeg ikke. Kan det ikke lade sig gøre via SQl alene kan jeg godt lave det alligevel, men så bliver det noget beskidt programmering med mange sql kald i vb. (og vi vil vel alle gerne at det der bliver lavet er så enkelt og godt som muligt)
Listen skal bruges i en produktion, hvor vi i dag skriver på en papirliste hvergang der bliver kørt en palle færdigvare på lager, Ca. en palle i timen fra hver af de 18 maskiner. Ved hver maskine står der en tynd klient hvor operatøren i dag indtaster hvad det er han laver og kan se pakkeinstruks og procesdata. Det hele foregår via webapplikationer og skrives til en MS SQL server.
select top 25 tln.id, tln.m_id, tln.lotnr, tln.init, tln.datotid, p.totalgram from TilLagerNu tln inner join (select lotnr, sum(gram) as totalgram from TilLagerNu group by lotnr ) as p on p.lotnr = tln.lotnr --her skriver du så dit join i varenavn osv. og husk at medtage det i din group by group by tln.id, tln.m_id, tln.lotnr, tln.datotid, tln.init, p.totalgram
Jeg er ikke helt sikker på hvad du mener med dato, i dit eksempel ser det ud som om du blot viser datoen. Jeg kan også hjælpe dig med joinet til din varenavnstabel, hvis du har behov.
Hej janus. Mange tak for hjælpen, det kom jeg en del længere ved, men der mangler bare lige det med datoen og sortering af grupperne
Forespørgslen ser nu sådan her ud:
SELECT TOP 25 tln.id, tln.m_id, tln.lotnr, varenavn.Prodnavn, varenavn.DebitorKontonavn, tln.init, tln.gram, tln.datotid, p.totalgram FROM TilLagerNu tln INNER JOIN (SELECT lotnr, SUM(gram) AS totalgram FROM TilLagerNu WHERE (m_id = 16) GROUP BY lotnr) p ON p.lotnr = tln.lotnr LEFT OUTER JOIN varenavn ON tln.lotnr = varenavn.ProdNummer GROUP BY tln.id, tln.m_id, tln.lotnr, tln.datotid, tln.init, p.totalgram, varenavn.Prodnavn, varenavn.DebitorKontonavn, tln.Gram
Hvis vi kigger på mit ønske(eksempel) er der 3 forskellige lotnr blandt de seneste 25 liner i tabellen hvor m_id=16: 183442, 183443, 200097 Forespørgslen skal så finde det største(nyeste) datotid for hver af de 3 lotnumre:
(id 79) 183442 11-01-2008 13:28:00 (id 90) 183443 15-01-2008 14:02:00 (id 94) 200097 15-01-2008 14:03:00
og listen viser så gruppen af 183442 først, så 183443 og nederst 200097.
Din kode virker perfekt, ud over datosorteringen.
Resultat at din kode. Jeg ved ikke hvordan den sorterer, men det ser ud til at det er på lotnr, og det dur ikke: id m_id lotnr Prodnavn DKn init GRAM datotid totalgram 16 16 160608 11-2060-GMXA-35 DOMO msv 125000 11-04-2007 10:50:00 1125000 7 16 160608 11-2060-GMXA-35 DOMO ses 125000 10-04-2007 10:02:00 1125000 8 16 160608 11-2060-GMXA-35 DOMO ses 125000 10-04-2007 10:02:00 1125000 9 16 160608 11-2060-GMXA-35 DOMO ses 125000 10-04-2007 10:02:00 1125000 11 16 160608 11-2060-GMXA-35 DOMO eu 125000 10-04-2007 10:03:00 1125000 12 16 160608 11-2060-GMXA-35 DOMO eu 125000 10-04-2007 10:03:00 1125000 13 16 160608 11-2060-GMXA-35 DOMO msv 125000 10-04-2007 10:03:00 1125000 14 16 160608 11-2060-GMXA-35 DOMO msv 125000 10-04-2007 10:03:00 1125000 15 16 160608 11-2060-GMXA-35 DOMO msv 125000 11-04-2007 10:28:00 1125000 1 16 181535 1-391-A/AB SL T AB msv 97500 10-04-2007 09:59:00 619550 2 16 181535 1-391-A/AB SL T AB msv 97500 10-04-2007 09:59:00 619550 3 16 181535 1-391-A/AB SL T AB msv 97500 10-04-2007 09:59:00 619550 4 16 181535 1-391-A/AB SL T AB naan 97500 10-04-2007 10:01:00 619550 5 16 181535 1-391-A/AB SL T AB naan 97500 10-04-2007 10:01:00 619550 6 16 181535 1-391-A/AB SL T AB anna 97500 10-04-2007 10:01:00 619550 10 16 181535 1-391-A/AB SL T AB ses 34550 10-04-2007 10:02:00 619550 17 16 183442 30-19610 CHES ses 100000 11-04-2007 11:21:00 1800000 18 16 183442 30-19610 CHES ses 100000 11-04-2007 12:51:00 1800000 19 16 183442 30-19610 CHES ses 100000 11-04-2007 12:11:00 1800000 20 16 183442 30-19610 CHES ses 100000 11-04-2007 12:21:00 1800000 21 16 183442 30-19610 CHES naan 100000 11-04-2007 12:21:00 1800000 22 16 183442 30-19610 CHES tn 100000 11-04-2007 12:31:00 1800000 23 16 183442 30-19610 CHES tn 100000 11-04-2007 12:41:00 1800000 24 16 183442 30-19610 CHES tn 100000 11-04-2007 12:51:00 1800000 25 16 183442 30-19610 CHES tn 100000 11-04-2007 13:11:00 1800000
SELECT TOP 25 tln.id, tln.m_id, tln.lotnr, varenavn.Prodnavn, varenavn.DebitorKontonavn, tln.init, tln.gram, max(tln.datotid) as datotid, p.totalgram FROM TilLagerNu tln INNER JOIN (SELECT lotnr, SUM(gram) AS totalgram FROM TilLagerNu WHERE (m_id = 16) GROUP BY lotnr) p ON p.lotnr = tln.lotnr LEFT OUTER JOIN varenavn ON tln.lotnr = varenavn.ProdNummer GROUP BY tln.id, tln.m_id, tln.lotnr, tln.init, p.totalgram, varenavn.Prodnavn, varenavn.DebitorKontonavn, tln.Gram
Prøv lige denne så... jeg har blot fjernet grupperingen på dato.
Men hvis det bare er en sortering, kan man så ikke blot tilføje order by?
SELECT TOP 25 tln.id, tln.m_id, tln.lotnr, varenavn.Prodnavn, varenavn.DebitorKontonavn, tln.init, tln.gram, tln.datotid, p.totalgram FROM TilLagerNu tln INNER JOIN (SELECT lotnr, SUM(gram) AS totalgram FROM TilLagerNu WHERE (m_id = 16) GROUP BY lotnr) p ON p.lotnr = tln.lotnr LEFT OUTER JOIN varenavn ON tln.lotnr = varenavn.ProdNummer GROUP BY tln.id, tln.m_id, tln.lotnr, tln.datotid, tln.init, p.totalgram, varenavn.Prodnavn, varenavn.DebitorKontonavn, tln.Gram order by tln.datotid, tln.lotnr
Hej igen. Det gode vejr gør at jeg er ved at grave min kælder fri og lave ny kloak og derfor ikke får set så meget på programmeringen som jeg også gerne vil.
Jeg har do prøvet din sql, men den roder helt rundt i resultatet nu. Du får lige en "skærmdump" af resultatet i morgen når jeg kommer på arbejde.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.