Kan det ikke gøres uden sub-select? Jeg har nemlig en rimelig kompleks SQL-query, som jeg ikke ønsker at tilføje subqueries til, da dette vil gå ud over performance.
så vidt jeg kan se er det enten en subselect eller en cursor. Nu ved jeg jo ikke hvor mange records du arbejder på, men der burde ikke ske det store performance drop ved det.
vil du venligst komme med eksempel på de data du ønsker skal være et resultat af forespørgslen ? ID Navn Postnr Beløb 1 Jens 8000 30,00 1 Mark 8000 30,00 1 Janus 8000 30,00 2 Karina 8000 20,00 2 Martin 8000 20,00 3 Frederik 9000 60,00 3 Tim 9000 60,00 4 Hans 9000 20,00 4 Viggo 9000 20,00
sql bla bla. output Postnr Sum 8000 50,00 9000 80,00
Det her passer ikke , hvis du kan udtrykke hvad du vil have kan vi hjælpe dig
SELECT o.Dato, COUNT(DISTINCT o.OrdreID) AS AntalOrdrer, COUNT(DISTINCT ol.VareID) AS AntalVarer, SUM(ol.Antal) AS AntalPakninger, SUM(o.TrukketBeløb) AS SamletTrukketBeløb FROM ordre o INNER JOIN Ordrelinie ol ON ol.OrdreID = o.OrdreID GROUP BY o.Dato
Okay, jeg har måske lige lavet en lille fejl. Det samlede trukne beløb kan vist ikke laves som en opsummering på o.TrukketBeløb. Da der bliver lavet en join til ordrelinierne, returneres der jo det antal rækker der er heri. Derfor skal det nok snarere laves som:
SELECT o.Dato, COUNT(DISTINCT o.OrdreID) AS AntalOrdrer, COUNT(DISTINCT ol.VareID) AS AntalVarer, SUM(ol.Antal) AS AntalPakninger, SamletTrukketBeløb FROM ( SELECT Dato, SUM(TrukketBeløb) AS SamletTrukketBeløb FROM ordre GROUP BY Dato ) AS os INNER JOIN Ordre o ON o.Dato = os.Dato INNER JOIN Ordrelinje ol ON ol.OrdreID = o.OrdreID GROUP BY o.Dato
lidt test viser at ordre er i scope men at ordre.ordreid giver problemer fordi den ikke er i GROUP BY
¤#"!#"¤#¤!
lidt eksperimenteret giver imidlertid 2 som virker:
SELECT oo.dato, COUNT(*), (SELECT SUM(antal) FROM ordrelinie WHERE ordrelinie.ordreid IN (SELECT ordreid FROM ordre io WHERE io.dato=oo.dato)), SUM(oo.trukketbeloeb) FROM ordre oo GROUP BY dato
og
SELECT oo.dato, COUNT(DISTINCT oo.ordreid), SUM(antal),(SELECT SUM(trukketbeloeb) FROM ordre io WHERE io.dato=oo.dato) FROM ordre oo JOIN ordrelinie ON oo.ordreid=ordrelinie.ordreid GROUP BY dato
1> CREATE TABLE ordre(ordreid INTEGER NOT NULL PRIMARY KEY, 2> navn VARCHAR(50), 3> dato DATETIME, 4> trukketbeloeb DECIMAL(12,2) 5> ) 6> GO 1> CREATE TABLE ordrelinie(linieid INTEGER NOT NULL PRIMARY KEY, 2> ordreid INTEGER, 3> vareid INTEGER, 4> stkpris DECIMAL(12,2), 5> antal INTEGER 6> ) 7> GO 1> INSERT INTO ordre VALUES(1,'Hans','1-2-2007',50.00) 2> GO (1 row affected) 1> INSERT INTO ordre VALUES(2,'Jens','1-2-2007',40.00) 2> GO (1 row affected) 1> INSERT INTO ordre VALUES(3,'Signe','2-2-2007',80.00) 2> GO (1 row affected) 1> INSERT INTO ordre VALUES(4 ,'Frank','2-2-2007',20.00) 2> GO (1 row affected) 1> INSERT INTO ordrelinie VALUES(1,1,123,50.00,2) 2> GO (1 row affected) 1> INSERT INTO ordrelinie VALUES(2,1,412,20.00,3) 2> GO (1 row affected) 1> INSERT INTO ordrelinie VALUES(3,2,382,40.00,1) 2> GO (1 row affected) 1> INSERT INTO ordrelinie VALUES(4,3,421,35.00,3) 2> GO (1 row affected) 1> INSERT INTO ordrelinie VALUES(5,4,482,40.00,1) 2> GO (1 row affected) 1> INSERT INTO ordrelinie VALUES(6,4,321,20.00,1) 2> GO (1 row affected) 1> SELECT oo.dato, 2> COUNT(*), 3> (SELECT SUM(antal) FROM ordrelinie WHERE ordrelinie.ordreid IN (SELECT ordreid FROM ordre io WHERE io.dato=oo.dato)), 4> SUM(oo.trukketbeloeb) 5> FROM ordre oo 6> GROUP BY dato 7> GO dato
(2 rows affected) 1> SELECT oo.dato, 2> COUNT(DISTINCT oo.ordreid), 3> SUM(antal),(SELECT SUM(trukketbeloeb) FROM ordre io WHERE io.dato=oo.d ato) 4> FROM ordre oo JOIN ordrelinie ON oo.ordreid=ordrelinie.ordreid 5> GROUP BY dato 6> GO dato
Dog var jeg på udkig efter en løsning, der ikke benytter Sub-queries, men nu du har brugt så meget tid på besvarelsen synes jeg det må være på plads med point.
Jeg har jo data så jeg kan nemt teste. Den sidste virker med en lille ændring (tilføjelse til GROUP BY):
1> SELECT o.Dato, COUNT(DISTINCT o.OrdreID) AS AntalOrdrer, COUNT(DISTINCT ol.Va reID) AS AntalVarer, SUM(ol.Antal) AS AntalPakninger, SUM(o.TrukketBeloeb) AS Sa mletTrukketBeloeb 2> FROM ordre o 3> INNER JOIN Ordrelinie ol ON ol.OrdreID = o.OrdreID 4> GROUP BY o.Dato 5> GO Dato AntalOrdrer AntalVarer AntalPakninger SamletTrukketBeloeb ----------------------- ----------- ----------- -------------- ---------------------------------------- 2007-01-02 00:00:00.000 2 3 6 140.00 2007-02-02 00:00:00.000 2 3 5 120.00
(2 rows affected) 1> SELECT o.Dato, COUNT(DISTINCT o.OrdreID) AS AntalOrdrer, COUNT(DISTINCT ol.Va reID) AS AntalVarer, SUM(ol.Antal) AS AntalPakninger, SamletTrukketBeloeb 2> FROM ( 3> SELECT Dato, SUM(TrukketBeloeb) AS SamletTrukketBeloeb 4> FROM ordre 5> GROUP BY Dato 6> ) AS os 7> INNER JOIN Ordre o ON o.Dato = os.Dato 8> INNER JOIN Ordrelinie ol ON ol.OrdreID = o.OrdreID 9> GROUP BY o.Dato 10> GO Msg 8120, Level 16, State 1, Server ARNEPC3, Line 1 Column 'os.SamletTrukketBeloeb' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 1> SELECT o.Dato, COUNT(DISTINCT o.OrdreID) AS AntalOrdrer, COUNT(DISTINCT ol.Va reID) AS AntalVarer, SUM(ol.Antal) AS AntalPakninger, SamletTrukketBeloeb 2> FROM ( 3> SELECT Dato, SUM(TrukketBeloeb) AS SamletTrukketBeloeb 4> FROM ordre 5> GROUP BY Dato 6> ) AS os 7> INNER JOIN Ordre o ON o.Dato = os.Dato 8> INNER JOIN Ordrelinie ol ON ol.OrdreID = o.OrdreID 9> GROUP BY o.Dato,os.SamletTrukketBeloeb 10> GO Dato AntalOrdrer AntalVarer AntalPakninger SamletTrukketBeloeb ----------------------- ----------- ----------- -------------- ---------------------------------------- 2007-01-02 00:00:00.000 2 3 6 90.00 2007-02-02 00:00:00.000 2 3 5 100.00
I øvrigt er det ikke helt rigtigt, at alle foreslåede løsninger baserer sig på subqueries. Min baserer sig i stedet på nested joins, hvilket ikke er det samme.
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.