Gå til innhold

Anbefalte innlegg

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 av lykkelit
Lenke til kommentar
Videoannonse
Annonse

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 av roac
Lenke til kommentar

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

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

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 av blackbrrd
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...