Avatar billede suse_linux Nybegynder
24. oktober 2011 - 23:06 Der er 10 kommentarer og
1 løsning

En SELECT, som jeg ikke lige kan dreje :-)

Hej allesammen.

Jeg har en tabel, som jeg gerne skulle bruge et udtræk fra, men min select volder mig lidt problemer.

tabellen er som følger(forenklet):

itemnr - S1 - S2 - S3 - Stock - Date (felter)
010101 - 01 - 01 - 01 - 3    - 01-01-2011
010101 - 01 - 01 - 01 - 2    - 20-01-2011
010102 - 01 - 01 - 01 - 10    - 02-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 2    - 03-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

Håber felterne forklarer sig selv, men ellers så:
Varenummer - variant1 - variant2 - variant3 - lager - (dato for lagerbevægelse)

Jeg vil gerne lave en select, for en bestemt dato, som viser lagerværdien for alle varenumre på den pågældende dato. hvis der ikke er en linje med indtastede dato for varenummeret, skal den tage den nærmeste dato, som er mindre end den indtastede.

eks.

19-01-2011 skal give:
010101 - 01 - 01 - 01 - 2    - 20-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

14-01-2011 skal give:
010101 - 01 - 01 - 01 - 3    - 01-01-2011
010102 - 01 - 01 - 01 - 10    - 02-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

09-01-2011 skal give:
010101 - 01 - 01 - 01 - 3    - 01-01-2011
010102 - 01 - 01 - 01 - 10    - 02-01-2011
010103 - 01 - 01 - 01 - 2    - 03-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

24-01-2011 skal give:
010101 - 01 - 01 - 01 - 2    - 20-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

Er det noget, som kan lade sig gøre?

På forhånd tak

Christian
Avatar billede suse_linux Nybegynder
24. oktober 2011 - 23:09 #1
19-01-2011 skal selvfølgelig give:
010101 - 01 - 01 - 01 - 3    - 01-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

my bad :)
25. oktober 2011 - 07:40 #2
Jeg lavede denne query (som naturligvis kun virker, hvis Date feltet i tabellen har data type DATE eller en anden type som man kan søge og sortere på:)

SELECT *, MAX(Date) FROM Stocktable WHERE Date <= '2011-10-23' GROUP BY itemnr;

Der er datoen 'hard-coded.'  Det ville naturligvis være at foretrække, hvis du kunne indføre datoen i en variabel.  Hvordan udfører du søgningen?  Fra en applikation, for eksempel skrevet i php?  I så fald kunne koden være:

<?php
$dato = [her indfører du datoen eller tager den fra en html formular eller lignende];
$result = mysql_query("SELECT *, MAX(Date) FROM Stocktable WHERE Date <= '$dato' GROUP BY itemnr;");
?>
Avatar billede suse_linux Nybegynder
25. oktober 2011 - 08:25 #3
Hej Christian

Jeg sidder og laver rapporter i FastReport og
Hvis jeg laver en GROUP BY, så dur Select * ikke. Så jeg har lavet følgende:

SELECT t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock, MAX(t1."DATE") FROM hstock t1 WHERE
t1."DATE" <= :PARDATE and
t1.stock <> 0
GROUP BY t1.itemnr, t1.s1, t1.s2, t1.s3, t1.shstart

Problemet er så bare, at jeg får for mange linjer ud.
Hvis jeg sætter dato til eks. '21.01.2011' så for jeg alle linjer ud og ikke kun de nyeste, for hvert varenummer-s1-s2-s3
25. oktober 2011 - 08:52 #4
Så du skal have sidste status per varenummer-s1-s2-s3 og ikke kun per varenummer. Ja, så skal du naturligvis have GROUP BY itemnummer, s1, s2, og s3.  Men hvad er shstart?  Den forekommer ikke i queryen og heller ikke i den (forenklede) tabel du viser.  Jeg vil gætte på, at det er den der gør at du får for mange linjer.  Hvad sker der hvis du kun grupper på itemnr, s1, s2, og s3?

Det lyder mystiskt at du ikke kan bruge * når du bruger GROUP BY.  Hvad sker der så?  Er det fordi du bruger FastReport (som jeg ikke kender)?  I phpmyadmin og når jeg kalder fra php har jeg ikke mødt problemer med * og GROUP BY.

Og jeg er nysgerrig efter hvad datatypen er for Date feltet i tabellen.
Avatar billede suse_linux Nybegynder
25. oktober 2011 - 09:07 #5
SELECT t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock, MAX(t1."DATE") FROM hstock t1 WHERE
t1."DATE" <= :PARDATE and
t1.stock <> 0
GROUP BY t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock

var det rigtige. Sorry :-)

Hvis jeg bruger select * og group by får jeg:
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Og det er FastReport, som er skyld i dette.

datatypen er DATE
25. oktober 2011 - 09:30 #6
Så det problem du opstillede er løst, ikke sandt?  I så fald, accepterer du mit svar #2?
Avatar billede suse_linux Nybegynder
25. oktober 2011 - 09:41 #7
Desværre ikke løst.

hvis jeg laver:

SELECT t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock, MAX(t1."DATE") FROM hstock t1 WHERE
t1."DATE" <= '21.01.2011' and
t1.stock <> 0
GROUP BY t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock



itemnr - S1 - S2 - S3 - Stock - Date (felter)
010101 - 01 - 01 - 01 - 3    - 01-01-2011
010101 - 01 - 01 - 01 - 2    - 20-01-2011
010102 - 01 - 01 - 01 - 10    - 02-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 2    - 03-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

får jeg:
010101 - 01 - 01 - 01 - 3    - 01-01-2011
010101 - 01 - 01 - 01 - 2    - 20-01-2011
010102 - 01 - 01 - 01 - 10    - 02-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 2    - 03-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

hvor jeg kun skulle have:
010101 - 01 - 01 - 01 - 2    - 20-01-2011
010102 - 01 - 01 - 01 - 5    - 15-01-2011
010103 - 01 - 01 - 01 - 8    - 10-01-2011
010103 - 01 - 01 - 02 - 3    - 01-01-2011

Men den driller godt nok lidt :-/
25. oktober 2011 - 09:51 #8
Når du vil have det vist per item-s1-s2-s3, hvorfor grupperer du så på stock?  Jeg foreslog i #4 GROUP BY itemnr, s1, s2, s3.  Og ikke andet.  Har du prøvet det?  Hvad får du så?
Avatar billede suse_linux Nybegynder
25. oktober 2011 - 10:02 #9
Hvis jeg bruger denne:
SELECT t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock, MAX(t1."DATE") FROM hstock t1 WHERE
t1."DATE" <= '21.01.2011' and
t1.stock <> 0
GROUP BY t1.itemnr, t1.s1, t1.s2, t1.s3

får jeg:
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

hvis jeg
SELECT t1.itemnr, t1.s1, t1.s2, t1.s3, MAX(t1."DATE") FROM hstock t1 WHERE
t1."DATE" <= '21.01.2011' and
t1.stock <> 0
GROUP BY t1.itemnr, t1.s1, t1.s2, t1.s3

Får jeg de rigtige linjer, men så mangler jeg stock værdien

Er bange for det nok ikke kan lavet på denne måde i fastreport :S
25. oktober 2011 - 10:28 #10
Jamen denne query:

SELECT t1.itemnr, t1.s1, t1.s2, t1.s3, t1.stock, MAX(t1."DATE") FROM hstock t1 WHERE
t1."DATE" <= '21.01.2011' and
t1.stock <> 0
GROUP BY t1.itemnr, t1.s1, t1.s2, t1.s3

er SQL-teknisk den rigtige hvis du vil have udskrevet stockværdierne men ikke grupperet på stockværdierne.  Ingen tvivl om den sag.  Hvis fastreport ikke kan lave det, så vil jeg foreslå, at du finder en andet applikation. 

Jeg er bange for, at jeg ikke kan hjælpe dig videre, og jeg er i øvrigt af tidshensyn nødt til at stoppe her.  Jeg mener at have svaret på dit spørgsmål, hvordan man i MYSQL laver et udtræk til at få de færdier du specificerede.  Hvis du mener som jeg, så accepter venligst mit svar #2.  Hvis du ikke mener jeg har været til hjælp, så opret selv et svar og accepter det.  Hvis du vil holde fast ved fastreport, så har du den mulighed at oprette et nyt spørgsmål, hvor du for eksempel i overskriften nævner fastreport (for at tiltrække medlemmer der kender dertil).  Det ville være godt i et sådant nyt spørgsmål at inkludere det du viser i #9.
Avatar billede suse_linux Nybegynder
25. oktober 2011 - 10:34 #11
Jeg er enig med dig i at select'en er korrekt, men mit problem nok ligger fastreport.
den kan jeg desværre ikke skifte, da folk over mig mener, at det der rigtige værktøj ;-)

takker for et korret svar og din tid
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