[SQL] 'Count' over 'group by' met 'where' conditie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Tony L
  • Registratie: September 2005
  • Laatst online: 07-11-2015
Wat ik niet goed begrijp is waarom ik in de onderstaande query niet met v.id kan binden. Heeft iemand enig idee wat hier de achterliggende reden voor is en hoe ik dit kan oplossen? Als ik de bovenliggende count(*) weg haal, kan ik wel met de originele tabel koppelen.

SQL:
1
2
3
4
5
6
7
8
9
10
select *,
    (select count(*) from
        (
            select count(vt.tenseId)
            from VerbTenses vt
            where vt.verbId = v.id
            group by vt.tenseId
        ) as Temp
    )
from Verbs v


Ik heb geen enkel idee hoe dit fenomeen heet en hoe ik er voor kan zorgen dat ik de v.id van de originele tabel kan gebruiken.

code:
1
Error Code: 1054. Unknown column 'v.id' in 'where clause'

PSN: Norfirin


Acties:
  • 0 Henk 'm!

  • Biersteker
  • Registratie: Juni 2009
  • Laatst online: 20:43
Haal je hier nu niet gewoon een count van een count op?

SQL:
1
2
3
4
            select count(vt.tenseId) 
            from VerbTenses vt 
            where vt.verbId = v.id 
            group by vt.tenseId 

Dit zal een nummer returnen namelijk . count(vt.tenseId).
Daaroverheen doe je:
SQL:
1
2
3
4
5
6
select count(*) from   (count(vt.tenseId) ) as Temp  

dus:
(count(vt.tenseId) ) = 1 result
Select count(1 result)
 

Originally, a hacker was someone who makes furniture with an axe.


Acties:
  • 0 Henk 'm!

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 06-07 22:35
http://stackoverflow.com/questions/2905292/where-vs-having

je hebt naast 'select', ook 'having'. In de link staat het eea uitgelegd.

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 00:15

The Eagle

I wear my sunglasses at night

Bij iedere select hoort een from. Daar ga je de mist in :)

Maar wat probeer je te doen :? Waarom een count van een count van een count?

[ Voor 40% gewijzigd door The Eagle op 08-05-2014 21:38 ]

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • Biersteker
  • Registratie: Juni 2009
  • Laatst online: 20:43
Ik bedenk me net, ben je niet zo'n contructie aan het maken?

SQL:
1
2
3
4
5
6
7
8
select *, 
        ( 
            select *, count(vt.tenseId) as counter 
            from VerbTenses vt 
            where vt.verbId = v.id 
            group by vt.tenseId 
        ) as Temp 
from Verbs v

?
Iets meer context zou een hoop verduidelijken. je haalt van een verbid de mogelijke tenses op, en wil die tellen op basis van een tenseId?

[ Voor 25% gewijzigd door Biersteker op 08-05-2014 22:38 ]

Originally, a hacker was someone who makes furniture with an axe.


Acties:
  • 0 Henk 'm!

  • Tony L
  • Registratie: September 2005
  • Laatst online: 07-11-2015
Ik wil de tenses kunnen tellen per verb. In de VerbTenses tabel zitten meerdere verschillende versies van een verb gebonden aan de tense:

VerbTenses
Id, TenseId, Name
1, 1, Loop
2, 1, Loopt
3, 1, Lopen
4, 2, Liep
5, 3, Liep
6, 4, Liepen

Een count(*) zonder 'group by' gaat niet lukken, omdat ik dan 6 terug krijg i.p.v. 2. Het probleem is alleen dat ik in de geneste count niet meer kan binden op de oorspronkelijke tabel.

PSN: Norfirin


Acties:
  • 0 Henk 'm!

  • Down
  • Registratie: Februari 2005
  • Laatst online: 04-07 19:43
Ik wil de tenses kunnen tellen per verb
Gewoon joinen en dan een group by?

SQL:
1
2
3
4
select v.id, count (vt.*)
from verb v
join verbtenses vt ON v.id = vt.verbid
group by v.id


Waar heb je de nesting voor nodig?

[ Voor 8% gewijzigd door Down op 09-05-2014 20:48 ]

Mother north, how can they sleep while their beds are burning?


Acties:
  • 0 Henk 'm!

  • Tony L
  • Registratie: September 2005
  • Laatst online: 07-11-2015
Dat werkt niet omdat ik dan de volgende getallen krijg:

VerbId, Count
'115','40'
'116','52'
'117','40'
'118','40'

Er zijn geen 40 tenses, maximaal 10. Ik moet éérst grouperen op de tenseId, vóórdat ik überhaupt in VerbTenses kan tellen,vandaar de count(*) over de gegroepeerde count(*).

Even een voorbeeld tabel voor de duidelijkheid:
Id, VerbId, TenseId, Passive, Active
'3046','115','1','αγνοώ','αγνοούμαι'
'3047','115','1','αγνοείς','αγνοείσαι'
'3048','115','1','αγνοεί','αγνοείται'
'3049','115','1','αγνοούμε','αγνοούμαστε'
'3050','115','1','αγνοείτε','αγνοείστε'
'3051','115','1','αγνοούν;αγνοούνε','αγνοούνται'

Er is maar één tenseId met de waarde 1. Als ik niet groepeer krijg ik veel te veel resultaten terug.

PSN: Norfirin


Acties:
  • 0 Henk 'm!

  • itons
  • Registratie: Oktober 2003
  • Niet online
Misschien even duidelijk je tabel definities posten en wat je nou precies wil ophalen met je query. Onduidelijk verhaal zo.

[ Voor 8% gewijzigd door itons op 10-05-2014 16:15 ]


Acties:
  • 0 Henk 'm!

  • Tony L
  • Registratie: September 2005
  • Laatst online: 07-11-2015
Ik wilde alleen een antwoord waarom het niet mogelijk is om binnen de binnenste count te binden met de moeder tabel.

Afbeeldingslocatie: http://www.practicegreek.com/temp/db.png

Waar het op neer komt. De gebruiker kan tenses oefenen. Hij moet hierbij een aantal instellingen instellen:
- Van tense(s)
- Naar tense(s)

Voorbeeld:
- Van: tegenwoordige tijd
- Naar: verleden tijd, voltooid verleden tijd

Daarnaast moet de gebruiker aangeven welke verbs hij wilt oefenen. Hierbij komt gelijk het probleem naar voren wat ik probeer op te lossen. Niet elke verb beschikt over alle tenses! Grammaticaal gezien dan! Dat wil zeggen dat ik alléén alle verbs wil ophalen die:

- Over een tegenwoordige tijd beschikken
- Over zowel de verleden tijd als de voltooid verleden tijd beschikken

Met een 'select * from table where column in (1, 2, 3)' kom er ik niet, aangezien ze allemáál dienen te matchen. Is er een andere SQL statement die werkt als "IN", alleen er dan voor moet zorgen dat ze daadwerkelijk allemaal moeten matchen?

PSN: Norfirin


Acties:
  • 0 Henk 'm!

  • itons
  • Registratie: Oktober 2003
  • Niet online
MySQL:
1
2
3
4
5
6
7
8
9
10
select * 
from verbs v
where exists (
              select '1' 
              from verbtenses vt1
              where vt1.verbid = v.id 
              and vt1.tenseid = (select id from tenses where name = 'Tegenwoordige tijd'))
              and exists (select '1' from verbtenses vt3 where vt3.verbid = v.id and vt3.tenseid = (select id from tenses where name ='Verleden tijd')
              and exists (select '1' from verbtenses vt4 where vt4.verbid = v.id and vt4.tenseid = (select id from tenses where name ='Voltooid verleden tijd')
);


Denk ik dan als ik het goed begrijp :Y)

Acties:
  • 0 Henk 'm!

  • Kalin848
  • Registratie: November 2005
  • Laatst online: 03-07 17:49
Voor SQL Server werkt deze code.

SQL:
1
2
3
4
5
6
7
8
9
10
select 
  distinct
  v.verb
  ,tenseID
  ,dense_rank() over (partition by v.verbid order by tenseid) 
  +dense_rank() over (partition by v.verbid order by tenseid desc) - 1 
  as Tenses
  ,count(1) over (partition by tenseid) as VerbsPerTense
from verbs v
inner join verbtenses vt ON v.verbid = vt.verbid
Pagina: 1