Avatar billede topceres Nybegynder
27. juni 2011 - 15:13 Der er 7 kommentarer og
1 løsning

Kombination af count i en og samme query

Hejsa ... en query, som jeg ikke kan få konstrueret, måske ikke mulig...? Så jeg checker eksperterne...:

Følgende simplificerede scenarie:


SELECT antal as x1 FROM tabel
(... +en masse joins...)
WHERE
(... +forskellige betingelser ...)
ORDER BY x1 desc


Det er jo let nok. MEN - i samme query (fordi resultatet gerne skulle sorteres på det) ønsker jeg at lægge resultatet sammen - x1+x2 (as x3 og så sortere på x3):

SELECT count(distinct kunde) as x2
(... +joins ...)
WHERE
(... +betingelser ...)


Hvordan søren gør jeg det, indlejrede sætninger eller? For - hvis jeg ikke tager meget fejl - laver man en count(), så returneres kun een row, har jeg ret?

På forhånd mange tak for assistance og gode idéer :-)
Avatar billede senil Nybegynder
27. juni 2011 - 15:31 #1
Select x1+x2 as x3
from
(

SELECT antal as x1 FROM tabel
(... +en masse joins...)
WHERE
(... +forskellige betingelser ...)

) data
order by x1+x2
Avatar billede majbom Novice
27. juni 2011 - 19:01 #2
som jeg ser dit spørgsmål vil du have lagt værdien af to felter sammen - er det korrekt?
Avatar billede topceres Nybegynder
28. juni 2011 - 07:17 #3
Tak for besvarelser. senil ... jeg ser ikke i dit forslag, hvor jeg selecter min x2 værdi. Lad mig prøve at uddybe lidt...

Jeg har min "normale" virkende query:

SELECT antal as x1 FROM tabel
(... +en masse joins...)
WHERE
(... +forskellige betingelser ...)
ORDER BY x1 desc

... i stedet for min x1 værdi skal jeg have x1 PLUS et count resultat fra en anden query ... denne query kommer her as is:


SELECT count( DISTINCT konto ) as x2
FROM online_ordre oo
JOIN ordre_data od ON od.ordre_id = oo.ordre_id
AND od.varenummer = 'xxxxxxxxxxx'
WHERE konto >100


... og så skal mit resultat sorteres på x1+x2 ...

How to do..? :-)
Avatar billede majbom Novice
28. juni 2011 - 08:14 #4
SELECT t.antal+oo_antal.x2 FROM tabel t
(... +en masse joins...)
LEFT JOIN (SELECT ordre_id, COUNT(DISTINCT konto) as x2 FROM online_ordre oo JOIN ordre_data od ON od.ordre_id = oo.ordre_id WHERE konto > 100 AND od.varenummer='xxxxxxxxxx' GROUP BY oo.ordre_id) oo_antal
ON t.ordre_id = oo.ordre_id
WHERE
(... +forskellige betingelser ...)
ORDER BY x1 desc


jeg ved ikke om navnene stemmer overens - jeg kender ikke dine tabeller - men det burde virke sådan dér
Avatar billede majbom Novice
28. juni 2011 - 08:15 #5
rettelse:

SELECT t.antal+oo_antal.x2 x1 FROM tabel t
Avatar billede topceres Nybegynder
28. juni 2011 - 14:09 #6
Tak for løsningen. Jeg tror det ville virke ... HVIS jeg på tidspunktet havde varenummeret (xxxxxxxx) - dette er dog "variabelt" da det er een af de ting, der selectes fra den første query (og joines på) ... og det er vel ikke tilgængeligt når den indlejrede select bliver fyret af? :-( Går ud fra, at en sådan indlejret bliver afviklet først og at jeg ikke kan varenummer = t.varenummer nede i den indlejrede... :-(
Avatar billede topceres Nybegynder
29. juni 2011 - 07:07 #7
Hej splazz (og andre?)

Nu har jeg fået konstrueret noget, der ligner ... ved at skele til dit forslag.

Det, jeg gør, er at finde varer fra en bestemt varegruppe med nogle betingelser på (pris mv.). Joiner, som du foreslog, med en indlejret sætning, hvor jeg laver en count på unikke kontonumre, som har købt samme varenummer - med samme betingelser ... og skulle mene, jeg lægger det sammen i toppen.

MEN ... den indlejrede sætning ... skal vel køre, for hvert resultat af den omkringliggende, ikke sandt? Pt. med nedenstående fulde query får jeg et samlet antal ved første resultatlinie af queryen, NULL i resten i min "synesom" ...

Hvad gør jeg forkert / kan jeg det, jeg gerne vil? :-)




SELECT vs.varenummer, ug.navn AS undergruppe, p.pris AS pris, vs.navn AS navn, pop.antal AS pop, sgo.antal + indl.custbought AS synesom
FROM varespec vs
JOIN priser p ON p.varenummer = vs.varenummer
JOIN varemap vm ON vm.varenummer = vs.varenummer
JOIN varegrupper vg ON vg.gruppe_id = vm.gruppe_id
LEFT JOIN undergruppe ug ON ug.ug_id = vm.undergruppe_id
LEFT JOIN short_pop pop ON pop.varenummer = vs.varenummer
LEFT JOIN synesGodtOm sgo ON sgo.varenummer = vs.varenummer
LEFT JOIN (

SELECT COUNT( DISTINCT konto ) AS custbought, vs.varenummer AS vnr2
FROM online_ordre oo
JOIN ordre_data od ON od.ordre_id = oo.ordre_id
JOIN varespec vs ON vs.varenummer = od.varenummer
JOIN varemap vm ON vm.varenummer = vs.varenummer
JOIN varegrupper vg ON vg.gruppe_id = vm.gruppe_id
JOIN priser p ON p.varenummer = vs.varenummer
WHERE oo.konto >100
AND p.pris_gruppe = 'Forhandler'
AND vs.online_p = '1'
AND p.pris >1
AND
  (
    vg.gruppe_id =1063
    OR vg.parent_id =1063
  )
)
AS indl ON indl.vnr2 = vs.varenummer
WHERE p.pris_gruppe = 'Forhandler'
AND vs.online_p = '1'
AND p.pris >1
AND
  (
  vg.gruppe_id =1063
  OR vg.parent_id =1063
  )
ORDER BY synesom DESC , pop DESC , pris ASC
Avatar billede topceres Nybegynder
11. august 2011 - 06:45 #8
Lukker, gav op og gjorde det på en anden måde (omend knap så elegant..)
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