lykkelit Skrevet 24. oktober 2007 Del Skrevet 24. oktober 2007 (endret) Hei! Jeg har så vidt begynt å lage noen spørringer i SQL. Jeg er helt selvlært og ikke så veldig god i dette enda. Men ved hjelp av SQL Server Enterprise Manager og SQL Query Analyzer har jeg å sett og vis fått til stort sett det jeg trenger. Jeg holder på å lage en spørring som jeg skal bruke i en .rpx rapport, og her må jeg til med en summering. Jeg har laget spørringen tidligere, og den har fungert så langt. Men nå må jeg altså legge til denne summeringen. Jeg vet ikke hvor jeg skal legge den inn i spørringen og ikke vet jeg helt om den er rett... Linjen jeg har lagt til er markert i rødt, men jeg får feil når jeg kjører denne etter at jeg har lagt til linjen. Er det noen der ute som kan hjelpe meg med dette?? Feilmeldingen jeg får lyder som følger: "Column 'dbo.COMPANY.COMPANY_NAME' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause." SELECT dbo.COMPANY.COMPANY_NAME, dbo.COMPANY.ADDRESS_1, dbo.COMPANY.ADDRESS_2, dbo.COMPANY.POSTAL_CODE, dbo.COMPANY.POSTAL_DESCRIPTION, dbo.COMPANY.PHONE_NO, dbo.COMPANY.FAX_NO , dbo.SUPPLIER.SUPPLIER_NAME 'Leverandørnavn' , dbo.SUPPLIER.EMAIL 'Leverandør_epost' , dbo.ORDER_LINE.ARTICLE_OBJ_NO , dbo.ORDER_LINE.DESCRIPTION 'Varenavn' , dbo.ORDER_LINE.QTY_DELIVERED 'Antall' , dbo.ORDER_LINE.COST_PRICE 'Kostpris' , dbo.ORDER_HEADING.ORDER_NO 'Ordrenr' , dbo.ORDER_HEADING.OUR_REFERENCE 'Vår_referanse' , dbo.ORDER_HEADING.INVOICE_DATE ' Dato' , dbo.SUPPLIER.SUPPLIER_NO, dbo.ORDER_LINE.QTY_DELIVERED * dbo.ORDER_LINE.COST_PRICE AS pristotalt, dbo.ARTICLE.SUPPLIER_OBJ_NO, dbo.ARTICLE.ARTICLE_NO 'Varenr', SUM(dbo.ORDER_LINE.QTY_DELIVERED * dbo.ORDER_LINE.COST_PRICE) AS SUMTOTALT FROM dbo.COMPANY INNER JOIN dbo.SUPPLIER ON dbo.COMPANY.COMPANY = dbo.SUPPLIER.COMPANY INNER JOIN dbo.ORDER_LINE ON dbo.COMPANY.COMPANY = dbo.ORDER_LINE.COMPANY INNER JOIN dbo.ORDER_HEADING ON dbo.COMPANY.COMPANY = dbo.ORDER_HEADING.COMPANY AND dbo.ORDER_LINE.COMPANY = dbo.ORDER_HEADING.COMPANY AND dbo.ORDER_LINE.COMPANY = dbo.ORDER_HEADING.COMPANY AND dbo.ORDER_LINE.ORDER_NO = dbo.ORDER_HEADING.ORDER_NO inner join dbo.article on dbo.article.obj_no = order_line.article_obj_no where ORDER_HEADING.ORDER_NO = ORDER_LINE.ORDER_NO AND SUPPLIER.obj_NO = ARTICLE.SUPPLIER_OBJ_NO Endret 24. oktober 2007 av lykkelit Lenke til kommentar
roac Skrevet 24. oktober 2007 Del Skrevet 24. oktober 2007 (endret) Når du bruker en aggregeringsfunksjon MÅ alle kolonner enten være med i aggregeringen, eller i en order by. Som du ser i tilfellet ditt blir det ganske mange kolonner som må være med i order by. Dette kan reduseres ved å bruke en named query, som vist i et lite eksempel under: use tempdb; create table tabell ( id int identity, ordrenr int, navn varchar(100), varenr int, pris numeric(9,2), antall int ); go insert into tabell values (1,'Ole Kristian',100,100,2); insert into tabell values (1,'Ole Kristian',101,50,3); insert into tabell values (2,'Henning',100,100,10); insert into tabell values (2,'Henning',101,50,2); insert into tabell values (3,'Frode',101,50,1); go select a.ordrenr, a.navn, b.total from tabell a inner join ( select min(id) as id, ordrenr, sum(pris*antall) as total from tabell group by ordrenr ) as b on (a.id = b.id); for ordens skyld, koden over returnerer: 1 Ole Kristian 350.00 2 Henning 1100.00 3 Frode 50.00 Endret 24. oktober 2007 av roac Lenke til kommentar
lykkelit Skrevet 25. oktober 2007 Forfatter Del Skrevet 25. oktober 2007 Da får jeg til å kjøre spørringen i vert fall! Takk for hjelpen der. Men jeg er ikke sikker på om jeg har fått det helt til likevel, selv om jeg har komt meg forbi alle feilmeldingene som jeg har møtt på veien... Jeg får liksom ikke det jeg var ute etter med SUM. Det jeg holder på å lage her er et ordreskjema. Dvs at fra en eksisterende ordre i programmet vårt så skal jeg kunne hente ut en ordrerapport. På denne rapporten kommer hver varelinje frem med varenr, varenavn kostpris og total sum for hver varelinje. Total sum for hver varelinje har jeg fått ved: dbo.ORDER_LINE.QTY_DELIVERED * dbo.ORDER_LINE.COST_PRICE AS pristotalt Men på slutten av rapporten så ønsker jeg å få en total sum for hele ordren. Og det var her problemene mine begynte. Fant ut at jeg måtte bruke en SUM-funksjon. Og denne ble da: SELECT SUM(dbo.ORDER_LINE.QTY_DELIVERED * dbo.ORDER_LINE.COST_PRICE) AS SUMTOTALT FROM dbo.ORDER_LINE GROUP BY ORDER_LINE.COST_PRICE Men i rapporten som bygger på denne spørringen får jeg ikke opp noen sum i feltet som da skal gi summen fra SUMTOTALT. Kan noen se noen feil i rapporten under? Er det noen som ser hvordan dette heller burde vært gjort? All hjelp taes imot med stor takk! SELECT dbo.COMPANY.COMPANY_NAME, dbo.COMPANY.ADDRESS_1, dbo.COMPANY.ADDRESS_2, dbo.COMPANY.POSTAL_CODE, dbo.COMPANY.POSTAL_DESCRIPTION, dbo.COMPANY.PHONE_NO, dbo.COMPANY.FAX_NO, dbo.SUPPLIER.SUPPLIER_NAME 'Leverandørnavn', dbo.SUPPLIER.EMAIL 'Leverandør_epost', dbo.ORDER_LINE.ARTICLE_OBJ_NO, dbo.ORDER_LINE.DESCRIPTION 'Varenavn', dbo.ORDER_LINE.QTY_DELIVERED 'Antall', dbo.ORDER_LINE.COST_PRICE 'Kostpris', dbo.ORDER_HEADING.ORDER_NO 'Ordrenr', dbo.ORDER_HEADING.OUR_REFERENCE 'Vår_referanse', dbo.ORDER_HEADING.INVOICE_DATE ' Dato', dbo.SUPPLIER.SUPPLIER_NO, dbo.ORDER_LINE.QTY_DELIVERED * dbo.ORDER_LINE.COST_PRICE AS pristotalt, dbo.ARTICLE.SUPPLIER_OBJ_NO, dbo.ARTICLE.ARTICLE_NO 'Varenr' FROM dbo.COMPANY INNER JOIN dbo.SUPPLIER ON dbo.COMPANY.COMPANY = dbo.SUPPLIER.COMPANY INNER JOIN dbo.ORDER_LINE ON dbo.COMPANY.COMPANY = dbo.ORDER_LINE.COMPANY INNER JOIN dbo.ORDER_HEADING ON dbo.COMPANY.COMPANY = dbo.ORDER_HEADING.COMPANY AND dbo.ORDER_LINE.COMPANY = dbo.ORDER_HEADING.COMPANY AND dbo.ORDER_LINE.COMPANY = dbo.ORDER_HEADING.COMPANY AND dbo.ORDER_LINE.ORDER_NO = dbo.ORDER_HEADING.ORDER_NO INNER JOIN dbo.article ON dbo.article.obj_no = order_line.article_obj_no WHERE ORDER_HEADING.ORDER_NO = ORDER_LINE.ORDER_NO AND SUPPLIER.obj_NO = ARTICLE.SUPPLIER_OBJ_NO SELECT SUM(dbo.ORDER_LINE.QTY_DELIVERED * dbo.ORDER_LINE.COST_PRICE) AS SUMTOTALT FROM dbo.ORDER_LINE GROUP BY ORDER_LINE.COST_PRICE Lenke til kommentar
roac Skrevet 25. oktober 2007 Del Skrevet 25. oktober 2007 Ah, så det du er på jakt etter er grouping Lenke til kommentar
lykkelit Skrevet 25. oktober 2007 Forfatter Del Skrevet 25. oktober 2007 Men må jeg ha med group by? (Jeg skjønte helt ærlig ikke så mye inne på den siden... Jeg kan bare det helt enkle i SQL foreløpig, og ellers så bare prøver og feiler jeg....) Er det noen som klarer å sette inn den SUM-funksjonen i spørringen min slik at den gir ønsket resultat? Har en følelse av at den er litt feilplassert i spørringen... Men jeg er ikke sikker.... Ah, så det du er på jakt etter er grouping Lenke til kommentar
blackbrrd Skrevet 25. oktober 2007 Del Skrevet 25. oktober 2007 (endret) Det du trenger er litt elementær opplæring i aggregate functions. Aggregate functions slår sammen flere rader til en rad. La oss si at du har en tabell med varenr og varebeløp og du er interessert i å vite hvor mye summen av alle varekjøpene er CREATE TABLE test ( varenr serial primary key, varebeløp integer ); SELECT SUM(varebeløp), varenr GROUP BY varenr GROUP BY sier her at jeg skal summere varebeløpet pr varenr La oss si at dataene ser slik ut: INSERT INTO test (varenr, varebeløp) VALUES (1,15); INSERT INTO test (varenr, varebeløp) VALUES (3,20); INSERT INTO test (varenr, varebeløp) VALUES (2,30); INSERT INTO test (varenr, varebeløp) VALUES (3,20); INSERT INTO test (varenr, varebeløp) VALUES (1,10); Da vil ovennevnte spørring gi: Varenr, Varebeløp 1, 25 2, 30 3, 40 Hvis jeg ikke hadde sagt hva jeg skulle gruppert på, så hadde jeg fått en feilmelding. Hvis du skal ha med flere kolonner enn bare varenr, f.eks en tenkt kolonne varebeskrivelse så må alle slike kolonner også være med i GROUP BY clausen. På sett og vis veldig tungvint, men det er ikke noe du får gjort noe særlig med Endret 25. oktober 2007 av blackbrrd Lenke til kommentar
roac Skrevet 25. oktober 2007 Del Skrevet 25. oktober 2007 og hvis du hiver på en "with rollup" så får du grand total som en egen rad på slutten: null, 95 :-) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå