webForumDet fria alternativet

distinct och group by tillsammans

Databaser & SQL

5 svar · 351 visningar · startad av daniel_ra

Medlem sedan jan. 2002381 inlägg
Frågan#1

Jag har gjort en fråga där jag använder distinct för att inte få fler träffar om jag har fler datum. jag vill sedan gruppera detta på en annan egenskap.

detta vill inte blir rärr och jag kommer inte på hur jag ska göra.

om jag har med datumet i selectsatsen och sedan grupperar på både datum och den andra egenskapen så fungerar inte distinct i selectsatsen, den tar med alla datum ändå. men jag kan ju inte ta bort datum från selectsatsen för då plockar den ju ut alla datum då också. hur gör jag?

exempel i tabellen:

ID | platsID | datum | personID
1 1 2007-01-01 1
2 1 2007-01-01 1
3 1 2007-01-01 1
4 2 2007-01-02 1
5 2 2007-01-03 1
6 2 2007-01-04 1
7 2 2007-01-04 1

jag skulle vilja göra en fråga likt detta:
select distinct personID,datum,count(*) as antal from tabell

och sedan gruppera detta resultat på plats så att jag får ett antal per plats och dag. varför jag vill ha en distinct i selecten är bara för att samma person kan välja samma plats flera gånger samma dag och jag är inte intresserad av detta, endast unika dagar

typ följande info:

personID | datum |plats | antal
1 2007-01-01 1 1
1 2007-01-02 2 3

hoppas ni fattar

Medlem sedan dec. 20025 483 inlägg
#2
select personid
     , datum
     , plats
     , ( select count(*)
           from tbl
          where datum = t.datum
            and plats = t.plats )
  from tbl t
group
    by personid
     , datum
     , plats

eller

select personid
     , datum
     , plats
     , count(*)
  from tbl
group
    by personid
     , datum
     , plats

?

Medlem sedan jan. 2002381 inlägg
#3

ditt första förslag förstår jag inte riktigt, hur skulle denna fungera och ditt andra förslag är precis så som jag gjort som inte blir korrekt. det blir inte korrekt av den anledningen att jag får flera träffar varje dag av samma person på samma plats, det är dessa träffar som jag vill plocka bort med en distinct.

om jag gör såhär:
select distinct personID,plats,datum as antal from tabell

så får jag fram de träffar som jag sedan vill gruppera

om jag grupperar dem så får jag ändå med de träffar jag ville ta bort med distinct, det är mitt problem..hmm knepigt

Medlem sedan dec. 20025 483 inlägg
#4

Då vill du ha:

select personid
     , plats
     , count(distinct datum)
  from tbl
group
    by personid
     , plats

Anledningen till att det är lite tvetydigt, är datumet du vill ha ut ur frågan. Av din senaste SELECT DISTINCT, vilket datum skall visas jämte person-id, plats och antal - det finns ju tre datum att välja bland?

Medlem sedan dec. 200012 464 inlägg
#5
select personid
     , datum
     , plats
     , count(distinct personid)
  from tbl
group
    by personid
     , datum
     , plats

Ditt förväntade resultat stämmer inte med dina värden. Hur får du 3 i antal på 2007-01-02?

Medlem sedan jan. 2002381 inlägg
#6

select personid
, plats
, count(distinct datum)
from tbl
group
by personid
, plats

funkar fint. du har rätt larsG, jag var lite klantig då jag räknade ihop förväntade värden.. tack för hjälpen!

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
132 ms — ändringar (db)