Avatar billede pipedane Nybegynder
19. maj 2008 - 14:29 Der 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.

Here we go:

Linier i tabellen TilLagerNu

ID    M_ID    LOTNR    INIT    GRAM    DATOTID
1    16    181535    msv    97500    10-04-2007 09:59:00
2    16    181535    msv    97500    10-04-2007 09:59:00
3    16    181535    msv    97500    10-04-2007 09:59:00
4    16    181535    naan    97500    10-04-2007 10:01:00
5    16    181535    naan    97500    10-04-2007 10:01:00
6    16    181535    anna    97500    10-04-2007 10:01:00
7    16    160608    ses    125000    10-04-2007 10:02:00
8    16    160608    ses    125000    10-04-2007 10:02:00
9    16    160608    ses    125000    10-04-2007 10:02:00
10    16    181535    ses    34550    10-04-2007 10:02:00
11    16    160608    eu    125000    10-04-2007 10:03:00
12    16    160608    eu    125000    10-04-2007 10:03:00
13    16    160608    msv    125000    10-04-2007 10:03:00
14    16    160608    msv    125000    10-04-2007 10:03:00
15    16    160608    msv    125000    11-04-2007 10:28:00
16    16    160608    msv    125000    11-04-2007 10:50:00
17    16    183442    ses    100000    11-04-2007 11:21:00
18    16    183442    ses    100000    11-04-2007 12:51:00
19    16    183442    ses    100000    11-04-2007 12:11:00
20    16    183442    ses    100000    11-04-2007 12:21:00
21    16    183442    naan    100000    11-04-2007 12:21:00
22    16    183442    tn    100000    11-04-2007 12:31:00
23    16    183442    tn    100000    11-04-2007 12:41:00
24    16    183442    tn    100000    11-04-2007 12:51:00
25    16    183442    tn    100000    11-04-2007 13:11:00
26    16    183442    msv    100000    11-04-2007 13:21:00
27    16    183442    msv    100000    11-04-2007 13:31:00
28    16    183442    msv    100000    11-04-2007 13:41:00
29    16    183442    oh    100000    11-04-2007 13:51:00
30    16    183442    oh    100000    11-04-2007 13:51:00
31    16    183442    oh    100000    11-04-2007 13:59:00
54    16    200097    MSV    125000    03-05-2007 22:35:00
55    16    200097    MSV    125000    03-05-2007 22:36:00
56    13    185435    SBM    100000    15-05-2007 08:47:00
57    13    186707    SBM    100000    30-05-2007 07:39:00
58    13    186707    SBM    100000    30-05-2007 07:39:00
59    13    185435    SBM    12550    30-05-2007 07:39:00
60    13    186707    SBM    100000    30-05-2007 07:40:00
61    13    186707    SBM    100000    30-05-2007 07:42:00
62    13    186707    SBM    100000    30-05-2007 07:42:00
63    13    185435    SBM    100000    30-05-2007 07:42:00
64    13    186707    SBM    100000    30-05-2007 07:44:00
65    13    186707    SBM    100000    30-05-2007 07:44:00
66    13    186707    SBM    100000    30-05-2007 07:44:00
67    16    200097    MSV    125000    11-09-2007 21:28:00
68    16    200097    MSV    97500    14-09-2007 08:03:00
70    16    200097    MSV    97500    14-09-2007 08:16:00
71    16    200097    MSV    97500    14-09-2007 08:16:00
72    16    200097    MSV    97500    14-09-2007 08:16:00
73    16    200097    MSV    97500    20-09-2007 14:07:00
74    16    183442    OH    100000    20-09-2007 14:12:00
75    16    200097    MSV    97500    11-01-2008 11:33:00
76    16    200097    MSV    97500    11-01-2008 11:33:00
77    16    200097    MSV    97500    11-01-2008 11:33:00
78    16    183442    OH    100000    11-01-2008 11:34:00
79    16    183442    HUGO    100000    11-01-2008 13:28:00
80    16    200097    JKL    97500    11-01-2008 13:30:00
81    16    183443    PHAN    200000    11-01-2008 13:35:00
82    16    183443    PHAN    100000    15-01-2008 13:57:00
83    16    183443    PHAN    100000    15-01-2008 14:01:00
84    16    183443    PHAN    100000    15-01-2008 14:02:00
85    16    183443    PHAN    100000    15-01-2008 14:02:00
86    16    183443    PHAN    100000    15-01-2008 14:02:00
87    16    183443    PHAN    100000    15-01-2008 14:02:00
88    16    183443    PHAN    100000    15-01-2008 14:02:00
89    16    183443    PHAN    100000    15-01-2008 14:02:00
90    16    183443    PHAN    100000    15-01-2008 14:02:00
91    16    183443    PHAN    100000    15-01-2008 14:02:00
92    16    200097    MSV    97500    15-01-2008 14:03:00
93    16    200097    MSV    100000    15-01-2008 14:03:00
94    16    200097    MSV    97500    15-01-2008 14:03:00
                   

Tabellen er joined til en anden tabel, varenavn, hvor jeg henter prodnavn og kundenavn ,, Join Varenavn on (tillager.lotnr = varenavn.lotnr)

Jeg kunne så godt tænke mig at jeg fik en liste der ser sådan her ud:

ID    M_ID    LOTNR    INIT    PRODN..    GRAM    DATOTID            TOTALGRAM
74    16    183442    OH    VARE_X    100000    20-09-2007 14:12:00    1800000
78    16    183442    OH    VARE_X    100000    11-01-2008 11:34:00    1800000
79    16    183442    HUGO    VARE_X    100000    11-01-2008 13:28:00    1800000
81    16    183443    PHAN    VARE_Y    200000    11-01-2008 13:35:00    1200000
82    16    183443    PHAN    VARE_Y    100000    15-01-2008 13:57:00    1200000
83    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:01:00    1200000
85    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
87    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
89    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
91    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
84    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
86    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
88    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
90    16    183443    PHAN    VARE_Y    100000    15-01-2008 14:02:00    1200000
70    16    200097    MSV    VARE_Z    97500    14-09-2007 08:16:00    1547500
72    16    200097    MSV    VARE_Z    97500    14-09-2007 08:16:00    1547500
73    16    200097    MSV    VARE_Z    97500    20-09-2007 14:07:00    1547500
75    16    200097    MSV    VARE_Z    97500    11-01-2008 11:33:00    1547500
77    16    200097    MSV    VARE_Z    97500    11-01-2008 11:33:00    1547500
76    16    200097    MSV    VARE_Z    97500    11-01-2008 11:33:00    1547500
80    16    200097    JKL    VARE_Z    97500    11-01-2008 13:30:00    1547500
93    16    200097    MSV    VARE_Z    100000    15-01-2008 14:03:00    1547500
92    16    200097    MSV    VARE_Z    97500    15-01-2008 14:03:00    1547500
94    16    200097    MSV    VARE_Z    97500    15-01-2008 14:03:00    1547500

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.
Avatar billede janus_007 Nybegynder
19. maj 2008 - 16:09 #1
Hej pipedane

Jo det kan skam snildt laves i ren SQL

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.
Avatar billede pipedane Nybegynder
20. maj 2008 - 13:43 #2
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

Mvh.
Martin
Avatar billede janus_007 Nybegynder
20. maj 2008 - 17:45 #3
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.
Avatar billede pipedane Nybegynder
20. maj 2008 - 19:12 #4
Det ødelægger resultatet. Nu tror jeg kun den sorterer efter datotid.

Resultatet:
id    m_id    lotnr    Prodnavn    DKn    init    gram    datotid        totalgram
1    16    181535    1-391-A/AB SL    AB    msv    97500    10-04-2007 09:59:00    619550
2    16    181535    1-391-A/AB SL    AB    msv    97500    10-04-2007 09:59:00    619550
3    16    181535    1-391-A/AB SL    AB    msv    97500    10-04-2007 09:59:00    619550
4    16    181535    1-391-A/AB SL    AB    naan    97500    10-04-2007 10:01:00    619550
5    16    181535    1-391-A/AB SL    AB    naan    97500    10-04-2007 10:01:00    619550
6    16    181535    1-391-A/AB SL    AB    anna    97500    10-04-2007 10:01:00    619550
7    16    160608    11-2060-GMXA-35    NV    ses    125000    10-04-2007 10:02:00    1125000
8    16    160608    11-2060-GMXA-35    NV    ses    125000    10-04-2007 10:02:00    1125000
9    16    160608    11-2060-GMXA-35    NV    ses    125000    10-04-2007 10:02:00    1125000
10    16    181535    1-391-A/AB SL    AB    ses    34550    10-04-2007 10:02:00    619550
11    16    160608    11-2060-GMXA-35    NV    eu    125000    10-04-2007 10:03:00    1125000
12    16    160608    11-2060-GMXA-35    NV    eu    125000    10-04-2007 10:03:00    1125000
13    16    160608    11-2060-GMXA-35    NV    msv    125000    10-04-2007 10:03:00    1125000
14    16    160608    11-2060-GMXA-35    NV    msv    125000    10-04-2007 10:03:00    1125000
15    16    160608    11-2060-GMXA-35    NV    msv    125000    11-04-2007 10:28:00    1125000
16    16    160608    11-2060-GMXA-35    NV    msv    125000    11-04-2007 10:50:00    1125000
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
Avatar billede janus_007 Nybegynder
26. maj 2008 - 18:54 #5
Hej igen.. beklager den lange svartid.

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
Avatar billede janus_007 Nybegynder
03. juni 2008 - 09:54 #6
Ping :)
Avatar billede pipedane Nybegynder
03. juni 2008 - 22:56 #7
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.
Avatar billede pipedane Nybegynder
12. juni 2008 - 07:44 #8
Unskyld, jeg virker måske ikke så interesseret i en løsning, men det er jeg. Der er bare mange ting ind i mellem.

Resulatet af din forespørgsel:

id    m_id    lotnr    Prodnavn    DKn    init    gram    datotid    totalgram
1    16    181535    1-391-A/AB SL    TR    msv    97500    10-04-2007 09:59:00    619550
2    16    181535    1-391-A/AB SL    TR    msv    97500    10-04-2007 09:59:00    619550
3    16    181535    1-391-A/AB SL    TR    msv    97500    10-04-2007 09:59:00    619550
4    16    181535    1-391-A/AB SL    TR    naan    97500    10-04-2007 10:01:00    619550
5    16    181535    1-391-A/AB SL    TR    naan    97500    10-04-2007 10:01:00    619550
6    16    181535    1-391-A/AB SL    TR    anna    97500    10-04-2007 10:01:00    619550
7    16    160608    11-2060-GMXA-35    DO    ses    125000    10-04-2007 10:02:00    1125000
8    16    160608    11-2060-GMXA-35    DO    ses    125000    10-04-2007 10:02:00    1125000
9    16    160608    11-2060-GMXA-35    DO    ses    125000    10-04-2007 10:02:00    1125000
10    16    181535    1-391-A/AB SL    TR    ses    34550    10-04-2007 10:02:00    619550
11    16    160608    11-2060-GMXA-35    DO    eu    125000    10-04-2007 10:03:00    1125000
12    16    160608    11-2060-GMXA-35    DO    eu    125000    10-04-2007 10:03:00    1125000
13    16    160608    11-2060-GMXA-35    DO    msv    125000    10-04-2007 10:03:00    1125000
14    16    160608    11-2060-GMXA-35    DO    msv    125000    10-04-2007 10:03:00    1125000
15    16    160608    11-2060-GMXA-35    DO    msv    125000    11-04-2007 10:28:00    1125000
16    16    160608    11-2060-GMXA-35    DO    msv    125000    11-04-2007 10:50:00    1125000
17    16    183442    30-19610    CL    ses    100000    11-04-2007 11:21:00    1800000
19    16    183442    30-19610    CL    ses    100000    11-04-2007 12:11:00    1800000
20    16    183442    30-19610    CL    ses    100000    11-04-2007 12:21:00    1800000
21    16    183442    30-19610    CL    naan    100000    11-04-2007 12:21:00    1800000
22    16    183442    30-19610    CL    tn    100000    11-04-2007 12:31:00    1800000
23    16    183442    30-19610    CL    tn    100000    11-04-2007 12:41:00    1800000
18    16    183442    30-19610    CL    ses    100000    11-04-2007 12:51:00    1800000
24    16    183442    30-19610    CL    tn    100000    11-04-2007 12:51:00    1800000
25    16    183442    30-19610    CL    tn    100000    11-04-2007 13:11:00    1800000
Avatar billede pipedane Nybegynder
20. juni 2008 - 10:42 #9
Så har jeg fået det som jeg vil have det.
Jeg har lavet et view på serveren med seneste 25 linier for maskinen

Lavet en lykke i asp der finder de forskellige lotnumre og ligger dem i en streng i rækkefølge som de skal vises.

slutteligt laver jeg en lykke der viser linierne for de forskellige lotnumre.

vb koden i asp fylder ca 25 linier og der bliver kun lavet 1 + 2 til 4 db kald alt efter hvor mange lotnumre der er.
Avatar billede pipedane Nybegynder
20. august 2008 - 08:44 #10
slut
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester