Avatar billede htx98i17 Professor
12. april 2006 - 13:07 Der er 9 kommentarer og
2 løsninger

Hjælp til sql

Jeg har følgende relevante tabeller:

CREATE TABLE `tblbruger` (
  `id` int(11) NOT NULL auto_increment,
  `navn` text NOT NULL,
  `brugernavn` text NOT NULL,
  `adgangskode` text NOT NULL,
  `level` int(11) NOT NULL default '0',
  `oprettet` datetime default NULL,
  `redigeret` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `sidstelogin` datetime NOT NULL default '0000-00-00 00:00:00',
  `timepris` float NOT NULL default '0',
  `ansat` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;

CREATE TABLE `tblorderlines` (
  `id` int(11) NOT NULL auto_increment,
  `ordreid` int(11) NOT NULL default '0',
  `oprettet` datetime NOT NULL default '0000-00-00 00:00:00',
  `redigeret` datetime default NULL,
  `opretterid` int(11) NOT NULL default '0',
  `editorid` int(11) NOT NULL default '0',
  `antal` int(11) NOT NULL default '0',
  `varetekst` text NOT NULL,
  `varenummer` bigint(13) default NULL,
  `brugsdato` datetime NOT NULL default '0000-00-00 00:00:00',
  `pris` float(11,2) NOT NULL default '0.00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1212 ;

CREATE TABLE `tblorders` (
  `id` int(11) NOT NULL auto_increment,
  `rekvisition` text NOT NULL,
  `oprettet` datetime default NULL,
  `redigeret` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `opretterid` int(11) NOT NULL default '0',
  `kundeid` int(11) NOT NULL default '0',
  `lukket` datetime default '0000-00-00 00:00:00',
  `budget` float default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=162 ;

CREATE TABLE `tbltimer` (
  `id` int(11) NOT NULL auto_increment,
  `oprettet` datetime default NULL,
  `redigeret` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `opretterid` int(11) NOT NULL default '0',
  `editorid` int(11) NOT NULL default '0',
  `brugerid` int(11) NOT NULL default '0',
  `arbejdsdato` datetime NOT NULL default '0000-00-00 00:00:00',
  `start` datetime NOT NULL default '0000-00-00 00:00:00',
  `slut` datetime NOT NULL default '0000-00-00 00:00:00',
  `timer` float NOT NULL default '0',
  `tillaegstimer` float NOT NULL default '0',
  `ordreid` int(11) NOT NULL default '0',
  `kommentar` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=696 ;

Jeg skal have lavet én sql der finder ud af ordrens samlede beløb.

Der skal medregnes materialer fra tblorderlines (antal*pris) hvor tblorderlines.ordreid = tblorders.id

Der skal medregnes timer fra tbltimer (tbltimer.timer*tblbruger.timepris) hvor tbltimer.brugerid = tblbruger.id og tbltimer.ordreid = tblorders.id

Output skal være ´ordrepris´ hvor det hele er lagt sammen.

Der må gerne bruges subselect hvis der er brug for det.
Avatar billede jmp.dk Nybegynder
12. april 2006 - 13:41 #1
Ved ikke hvilken database du bruger men syntaxen er noget i stil med:

select SUM( (SELECT SUM( ol.antal*ol.pris ) FROM tblorderlines ol where ol.ordreid = o.id ) +
(SELECT SUM( (t.timer+t.tillaegstimer)*b.timepris from tbltimer t join tblbruger b on t.brugerid = b.id where t.ordreid = o.id ) )
FROM tblorders
Avatar billede htx98i17 Professor
12. april 2006 - 13:46 #2
Det er mysql.

Jeg er desværre ikke vant til at bruge sub selects så jeg kan ikke selv se de åbenlyse fejl, men den siger:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from tbltimer t join tblbruger b on t.brugerid = b.id where t.ordreid = o.id ) )' at line 2
Avatar billede htx98i17 Professor
12. april 2006 - 13:50 #3
tjo der er 6 stk ( og 5 stk. )
hvor mangler der en?
Avatar billede htx98i17 Professor
12. april 2006 - 13:55 #4
Jeg satte lidt struktur på og fik det til at virke

tusind tak for hjælpen, nu har jeg et lille indblik i hvordan jeg bruger sub selects

SELECT
    SUM(
        (SELECT
            SUM( ol.antal * ol.pris )
        FROM
            tblorderlines ol
       
        WHERE
            ol.ordreid = o.id
        )
        +
        (
        SELECT
            SUM(
                (t.timer + t.tillaegstimer)
                * b.timepris
                )
           
            FROM
                tbltimer t
           
            JOIN tblbruger b ON
                t.brugerid = b.id
           
            WHERE t.ordreid = o.id
        )
    )
    FROM
        tblorders o
   
    WHERE
        o.id = '160'
Avatar billede jmp.dk Nybegynder
12. april 2006 - 13:56 #5
Sorry prøv:
select SUM( (SELECT SUM( ol.antal*ol.pris ) FROM tblorderlines ol where ol.ordreid = o.id ) +
(SELECT SUM( (t.timer+t.tillaegstimer)*b.timepris) from tbltimer t join tblbruger b on t.brugerid = b.id where t.ordreid = o.id ) )
FROM tblorders
Avatar billede htx98i17 Professor
12. april 2006 - 13:59 #6
hov jeg har fundet en lille fejl.

Der er ikke nødvendigvis både timer og materialer i en ordre. Det kan f.eks. godt kun være materialer.

Den sql du har lavet tager så vidt jeg kan se ikke højde for det... ?
Avatar billede jmp.dk Nybegynder
12. april 2006 - 14:03 #7
Jo det tror jeg den gør
Der bruges 2 subselects en der giver prisen for de eventuelle orderlines og en for timeprisen, hvis der ikke er nogen ordre linier der matcher dit ordre id så bliver summen 0 og ligeledes med time priserne.
Ups kan lige se der mangler et alias til sidst i sætningen:

select SUM( (SELECT SUM( ol.antal*ol.pris ) FROM tblorderlines ol where ol.ordreid = o.id ) +
(SELECT SUM( (t.timer+t.tillaegstimer)*b.timepris) from tbltimer t join tblbruger b on t.brugerid = b.id where t.ordreid = o.id ) )
FROM tblorders o
Avatar billede htx98i17 Professor
12. april 2006 - 14:06 #8
Den sql jeg har postet 13:55 har alias og den parentes der manglede. Den finder kun en samlet pris hvis der både er materialer og timer i ordre. Hvis der mangler enten materialer eller timer, poster den NULL
Avatar billede jmp.dk Nybegynder
12. april 2006 - 14:24 #9
Kender ikke MySql særligt godt, men prøv:
SELECT
    SUM(
        IFNULL((SELECT
            SUM( ol.antal * ol.pris )
        FROM
            tblorderlines ol
       
        WHERE
            ol.ordreid = o.id
        ),0 )
        +
        IFNULL((
        SELECT
            SUM(
                (t.timer + t.tillaegstimer)
                * b.timepris
                )
           
            FROM
                tbltimer t
           
            JOIN tblbruger b ON
                t.brugerid = b.id
           
            WHERE t.ordreid = o.id
        ),0 )
    )
    FROM
        tblorders o
   
    WHERE
        o.id = '160'
Avatar billede htx98i17 Professor
12. april 2006 - 14:26 #10
så virker den, mange tak for hjælpen...
Avatar billede jmp.dk Nybegynder
12. april 2006 - 14:31 #11
Var så lidt, sjovt nok sidder jeg også lige og laver ordre håndtering lige nu :-)
Dog med MS Sqlserver.
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