Avatar billede larsomania Nybegynder
04. februar 2003 - 11:16 Der er 1 løsning

Forskel på svar med og uden UNION

Hejsa,

Jeg forsøger at få en forespøgsel til at køre, der kan returnere et gennemsnit af alle brugere, samt den bruger der har det højeste + den der har det laveste gennemsnit.

Jeg har følgende tre queries til det:

Overall snit:
select '' as CompGroupMax, '' as CompGroupMin, 0 as NumberMin, 0 as NumberMax, 0 as AverageMin, 0 as AverageMax, avg(fareamount) as AverageAll, count(*) as NumberAll from orderrep where routing like 'CPH-AMS-CPH' and createdate>'01-01-2002' and createdate<'12-31-2002' and Fak_Kre='I'

Bruger med højeste:
select top 1 compgroup as CompGroupMax, '' as CompGroupMin, 0 as NumberMin, count(*) as NumberMax, 0 as AvereageMin, avg(fareamount) AS AverageMax, 0 as AverageAll, 0 as NumberAll from orderrep where routing like 'CPH-AMS-CPH' and createdate>'01-01-2002' and createdate<'12-31-2002' and Fak_Kre='I' group by compgroup order by avg(fareamount) DESC

Bruger med laveste:
select top 1 '' as CompGroupMax, compgroup as CompGroupMin, count(*) as NumberMin, 0 as NumberMax, avg(fareamount) AS AverageMin, 0 as AverageMax, 0 as AverageAll, 0 as NumberAll from orderrep where routing like 'CPH-AMS-CPH' and createdate>'01-01-2002' and createdate<'12-31-2002' and Fak_Kre='I' group by compgroup order by avg(fareamount)


Disse tre queries returnerer hver for sig det korrekte resultat. Jeg prøver så at kombinere dem via UNION:

select * from
(
(select '' as CompGroupMax, '' as CompGroupMin, 0 as NumberMin, 0 as NumberMax, 0 as AverageMin, 0 as AverageMax, avg(fareamount) as AverageAll, count(*) as NumberAll from orderrep where routing like 'CPH-AMS-CPH' and createdate>'01-01-2002' and createdate<'12-31-2002' and Fak_Kre='I')
union
(select top 1 '' as CompGroupMax, compgroup as CompGroupMin, count(*) as NumberMin, 0 as NumberMax, avg(fareamount) AS AverageMin, 0 as AverageMax, 0 as AverageAll, 0 as NumberAll from orderrep where routing like 'CPH-AMS-CPH' and createdate>'01-01-2002' and createdate<'12-31-2002' and Fak_Kre='I' group by compgroup order by avg(fareamount))
union
(select top 1 compgroup as CompGroupMax, '' as CompGroupMin, 0 as NumberMin, count(*) as NumberMax, 0 as AvereageMin, avg(fareamount) AS AverageMax, 0 as AverageAll, 0 as NumberAll from orderrep where routing like 'CPH-AMS-CPH' and createdate>'01-01-2002' and createdate<'12-31-2002' and Fak_Kre='I' group by compgroup order by avg(fareamount) DESC)
) x

Hvor jeg får tre rækker (en fra hver query) den første er stadig korrekt. Men de to sidste queries returnerer nu den samme bruger, som er en anden end de to der blver returneret ef den ene hhv. den anden query når de køres hver for sig.

Er der nogen, der kan gennemskue hvad der sker??
Avatar billede sql_god Nybegynder
06. februar 2003 - 13:05 #1
Ja. Du skal bruge UNION ALL, da denne vil give alle ikke-unikke svar. Du har sikkert for få data i dit datasæt. Du kan også få dem ud i den rigtige rækkefølge:

SELECT 1 as No, [Felter]
UNION ALL
SELECT 2 as No, [Felter]
UNION ALL
SELECT 3 as No, [Felter]
..
Order by No

husk at OrderBy kun må stå i det sidste SELECT statement, af de tre.
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