Avatar billede super_bedst Novice
25. oktober 2014 - 12:06 Der er 9 kommentarer

Gruppe sum på rækker

Hej Eksperter
Jeg er lidt usikker på kategorien på denne, om det er denne kategori eller php
Jeg har lidt udfordringer med følgende, har en tabel der ser ud som nedenstående
Dato Lagersted Varenr Beskrivelse Projekt Antal
25-10-2014 Lager 1 245090 Kabelbøjle nr. 16 29020008 3
25-10-2014 Lager 1 698020 Blindprop til dobbelt dataudtag sort 30400016 3
25-10-2014 Lager 1 245090 Kabelbøjle nr. 16 29020008 3
25-10-2014 Lager 1 698020 Blindprop til dobbelt dataudtag sort 30400016 3
25-10-2014 Lager 2 245090 Kabelbøjle nr. 16 29020008 5
25-10-2014 Lager 2 698021 Blindprop RJ45 hvid 30400016 2
25-10-2014 Lager 2 245090 Kabelbøjle nr. 16 29020008 5
25-10-2014 Lager 2 698021 Blindprop RJ45 hvid 30400016 2

resultatet er for hver lager, ønskes sumtotalerne for hvert varenummer således det ligner nedenstående:
Dato Lagersted Varenr Beskrivelse Projekt Antal
25-10-2014 Lager 1 245090 Kabelbøjle nr. 16 29020008 6
25-10-2014 Lager 1 698020 Blindprop til dobbelt dataudtag sort 30400016 6 
25-10-2014 Lager 2 245090 Kabelbøjle nr. 16 29020008 10
25-10-2014 Lager 2 698021 Blindprop RJ45 hvid 30400016 4



Jeg har forsøgt med nedenstående kode, men det giver ikke noget svar i kolonnen antal, og viser alle rækker
Dato = date("Y-m-d");
$Sb = '(Lager)';
$result = mysql_query("SELECT * FROM Forbrug WHERE Dato BETWEEN '$Dato' AND '$Dato' ORDER BY $Sb")
or die(mysql_error());
echo "<table>";
echo '<tr><td align="center">Dato</td><td align="center">Lagersted</td><td align="center">Varenr</td><td align="center">Beskrivelse</td><td align="center">Projekt</td><td align="center">Antal</td></tr>';
while($row = mysql_fetch_array( $result )) {
    echo '<tr><td align="center">';
        $DatoPrint = date("d-m-Y", strtotime($row['Dato']));
    echo $DatoPrint;
    echo '</td><td align="center">';
        echo $row['Lager'];
        echo '</td><td align="center">';
        echo $row['Varenr'];
    echo "</td><td>";        echo $row['Beskrivelse'];
echo "</td><td>";        echo $row['Projekt'];
echo '</td><td align="center">';        echo $row['SUM(Antal)'];
echo "</td></tr>";
}
echo "</table>";

Hvad er fejlen
Avatar billede olsensweb.dk Ekspert
25. oktober 2014 - 13:17 #1
>Jeg er lidt usikker på kategorien på denne, om det er denne kategori eller php
det er en af fordelene ved http://www.udvikleren.dk , der kan man sætte de relevante tags for spørgsmålet

jeg kan tilgængæld ikke forstå hvorfor du anvender det gamle mysql API!! jeg og vil andre vil anbefale dig at skifte til mysqli eller PDO (personligt foretrækker jeg PDO)

prøv denne sql (tested i phpmyadmin)

SELECT *, SUM(antal) as sum_antal FROM exp_998803 WHERE Dato BETWEEN '2014-10-20' AND '2014-10-25' GROUP BY `Varenr`


output

ID     Dato     Lagersted     Varenr     Beskrivelse     Projekt     Antal     sum_antal    
1     2014-10-24     Lager 1     245090     Kabelbøjle nr. 16     29020008     3     16
2     2014-10-24     Lager 1     698020     Blindprop til dobbelt dataudtag sort     30400016     3     6
6     2014-10-24     Lager 2     698021     Blindprop RJ45 hvid     30400016     2     4


test data

--
-- Struktur-dump for tabellen `exp_998803`
--

CREATE TABLE IF NOT EXISTS `exp_998803` (
  `ID` int(11) NOT NULL,
  `Dato` date DEFAULT NULL,
  `Lagersted` varchar(255) COLLATE utf8_danish_ci DEFAULT NULL,
  `Varenr` varchar(255) COLLATE utf8_danish_ci DEFAULT NULL,
  `Beskrivelse` varchar(255) COLLATE utf8_danish_ci DEFAULT NULL,
  `Projekt` varchar(255) COLLATE utf8_danish_ci DEFAULT NULL,
  `Antal` varchar(255) COLLATE utf8_danish_ci DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

--
-- Data dump for tabellen `exp_998803`
--

INSERT INTO `exp_998803` (`ID`, `Dato`, `Lagersted`, `Varenr`, `Beskrivelse`, `Projekt`, `Antal`) VALUES
(1, '2014-10-24', ' Lager 1', '245090', ' Kabelbøjle nr. 16', '29020008', '3'),
(2, '2014-10-24', ' Lager 1', '698020', ' Blindprop til dobbelt dataudtag sort', '30400016', '3'),
(3, '2014-10-24', ' Lager 1', '245090', ' Kabelbøjle nr. 16', '29020008', '3'),
(4, '2014-10-24', ' Lager 1', '698020', ' Blindprop til dobbelt dataudtag sort', '30400016', '3'),
(5, '2014-10-24', ' Lager 2', '245090', ' Kabelbøjle nr. 16', '29020008', '5'),
(6, '2014-10-24', ' Lager 2', '698021', ' Blindprop RJ45 hvid', '30400016', '2'),
(7, '2014-10-24', ' Lager 2', '245090', ' Kabelbøjle nr. 16', '29020008', '5'),
(8, '2014-10-24', ' Lager 2', '698021', ' Blindprop RJ45 hvid', '30400016', '2');
Avatar billede super_bedst Novice
25. oktober 2014 - 13:39 #2
Det ser godt ud, men i eksemplet bliver kabelbøjlen lagt sammen fra de 2 lagre (lager 1 forbrug 5+5, Lager 2 forbrug 3+3) når Query kører giver det lager 1 forbrug i sum_antal på 16, og ikke lager 1 forbrug 10, og lager 2 forbrug 6

Med hensyn til brug af det gamle mysql api, er dette fordi jeg er ved at lave ændringer i noget gammelt noget, og jeg ikke har på nuværende tidspunkt har det store overskud til at sætte mig ind i det nye api, og siden hvor dette kører på kun ligger internt, og ikke i offentlig adgang, hvorved jeg har vurderet risikoen ikke er så stor. Men det er fint du gør opmærksom på det.
Avatar billede olsensweb.dk Ekspert
25. oktober 2014 - 14:06 #3
>siden hvor dette kører på kun ligger internt
det gamle mysql API bliver fjernet i kommende vertioner af PHP og allerede siden 20-06-2013 har du fået en advarsel når du anvendte mysql_connect
ref http://php.net/ChangeLog-5.php
Version 5.5.0
20 Jun 2013



aha du har sammen vare nummer liggende på 2 lagre

SELECT *, SUM(antal) as sum_antal FROM exp_998803 WHERE Dato BETWEEN '2014-10-20' AND '2014-10-25'GROUP BY Lagersted, Varenr

output

ID     Dato     Lagersted     Varenr     Beskrivelse     Projekt     Antal     sum_antal    
1     2014-10-24     Lager 1     245090     Kabelbøjle nr. 16     29020008     3     6
2     2014-10-24     Lager 1     698020     Blindprop til dobbelt dataudtag sort     30400016     3     6
5     2014-10-24     Lager 2     245090     Kabelbøjle nr. 16     29020008     5     10
6     2014-10-24     Lager 2     698021     Blindprop RJ45 hvid     30400016     2     4
Avatar billede super_bedst Novice
25. oktober 2014 - 14:08 #4
Hej
Jeg fandt selv løsningen :-) skulle lige kigge dit svar igennem, og tænke over det, så gav det jo  sig selv det blot skulle tilføjes :
"SELECT * , SUM( antal ) AS sum_antal
FROM Forbrug
WHERE Dato
BETWEEN '2014-10-20'
AND '2014-10-25'
GROUP BY `Lager`,`Beskrivelse`
ORDER BY `Lager`,`Projekt` ASC
25. oktober 2014 - 16:22 #5
Jeg kan ikke dy mig, men din database struktur synes ikke optimal.  Formodenligt har en vare med et bestemt varenummer altid den samme beskrivelse, for eksempel er varenummer 698020 altid 'Blindprop til dobbelt dataudtag sort'.  Derfor er det spild af energi (og opslagsplads) at skrive det igen og igen i tabellen, og det er også en fejlkilde.  Hvis for eksempel du et sted kommer til at skrive 'blindprop ....' i stedet for 'Blindprop...' så går der gak i det når du grupperer på beskrivelse.  Den gængse praktik er at oprette en særskilt tabel til beskrivelse, såsom:

id Varenr Beskrivelse
1 245090 Kabelbøjle nr. 16
2 698020 Blindprop til dobbelt dataudtag sort
3 698021 Blindprop RJ45 hvid

I din hovedtabel har du så kun disse kolonner:
Dato Lagersted Varenr Projekt Antal

og du grupperer på varenr i stedet for på beskrivelse.

Din query bliver så
SELECT f.*, b.Beskrivelse
FROM Forbrug f
JOIN beskrivelse b ON f.Varenr = b.Varenr
WHERE ......
GROUP BY Lager, Varenr
......
Avatar billede super_bedst Novice
28. oktober 2014 - 19:43 #6
Hejsa
Har først set dit svar nu.
Jeg har følgende Tabeller:

Vare, som indeholder: Id, Varenr, Beskrivelse, Projekt og i_type

den indlæses i en form i forskellige kolonner efter i_type.

formen sendes til tabellen forbrug med de felter der er stører end nul, tabellen indeholder: Id, Varenr, Beskrivelse, Projekt, Antal, Lager og Dato

og det er tabellen forbrug der her udlæses fra.
Jeg kan godt følge dig i det kan være en ide at sortere efter varenr, i stedet for beskivelse, men når det er værdier der er udlæst fra en anden tabel, og det således er skrevet ens hver gang, vil det vel ikke ha den store betydning??

hvorledes kan man maile resultatet for hver gruppe til en modtager, således centrallageret en mail, med forbrug for lager 1, en ny mail med forbrug for lager 2 osv?

ved godt at dette skal sættes op som et cronjob eller lignende, men det er lige bodyen jeg har stiret mig blind på hvordan jeg skal slå hul på :-)
29. oktober 2014 - 07:03 #7
Du udvider spørgsmålet om hvordan du kan maile resultaterne.  Jeg vil foreslå, at du opretter et frisk spørgsmål om det, så det bliver set af alle Ekspertens medlemmer, ikke kun mig.

Jeg skal her, igen, blande mig i det du ikke spørger om og som du synes at være godt tilfreds med, din datastruktur.  Du kan jo så sige, at jeg skal lade dig være i fred.  Men nu kikker jeg på din Vare tabel.  Jeg vil gætte på, at en vare kan indgå i mange forskellige projekter og hvert projekt kan indeholde mange forskellige varer. Hvis du har blot ti varer og fem projekter risikerer du at skulle have 50 rækker i tabellen, hvor du så gentager en masse gange at for eksempel varenummer 698020 er 'Blindprop til dobbelt dataudtag sort'. 

Du har, som jeg ser det, for det første brug for en tabel som jeg her vil kalde 'Varer' med nummer og beskrivelse.  Den tabel har kun en række for hvert varenummer.  For det andet har du vel brug for en tabel 'Projekter' med nummer og navn, igen række for hvert projekt.  Og så en tabel 'VareProjekt' med felterne varenr og projektnr til at holde styr på hvilke varer indgår i hvilke projekter.  Hvis for eksempel varenummer 27 indgår i projekterne 112 og 115 og varenummer 28 indgår i projekterne 112 og 116 får VareProjekt tabellen dette indhold:

id varenr projektnr
1    27    112
2    27    115
3    28    112
4    28    116

I så fald kan den Vare tabel du beskriver erstattes med en query såsom:

SELECT v.nummer, v.beskrivelse, p.nummer, p.navn
FROM Varer v
JOIN VareProjekt vk ON v.nummer = vk.varenr
JOIN Projekt p ON vk.projektnr = p.nummer

Så med, for eksempel, ti varer og fem projekter kommer din database til at bestå af femten korte rækker data, og de op til 50 lange rækker i 'Vare' bliver reduceret til nummer-kombinationer, og i hele din database står der kun på et enkelt sted, at varenummer 698020 er 'Blindprop til dobbelt dataudtag sort'. Det er det der er ideen med en normaliseret database.  Det bliver naturligvis vigtigere, hvis der er måske 1000 varer og 100 projekter.

Jeg har her 'glemt' alt om it_type, men eksemplet kan sagtens udvides.  Din Forbrug tabel kan forenkles efter samme principper.
12. november 2014 - 18:34 #8
super_best, der har ikke været aktivitet på dette spørgsmål i to uger; kan jeg bede dig lukke det igen i overensstemmelse med Ekspertens regler?  Du siger, at du selv fandt løsningen, så det naturlige er vel, at du selv opretter et svar og accepterer det.  Så er der ryddet op, og spørgsmålet står ikke længere som åbent i min (og andres) liste af indlæg.
03. maj 2015 - 11:17 #9
super_best, jeg prøver lige en gang mere.  Du oprettede spørgsmålet, og du siger det er løst (af dig selv.)  Kan jeg derfor bede dig lukke spørgsmålet igen (med eget svar), så det ikke længere står som åbent i min (og andres) liste af indlæg?  Please.
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

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