0

私はクラブと例会の間に1対多の構造を持っています

Clubs
Id    
1     
2
3
4

Meetings
Id    ClubId    MeeetingDate
1      1        2010-Mar-01
2      1        2010-Apr-01
3      2        2011-May-01
4      3        2011-Aug-01
5      3        2012-Sep-01
6      3        2012-Aug-01

すべてのクラブと、より多くの例会の数を取得したいgetDate()

したがって、結果は次のようになります

Club.Id    Count
1            0     (there are 0 meetings > getDate)
2            0     (there are 0 meetings > getDate)  
3            2     (there are 2 meetings > getDate)
4            0     (there are NO meetings)

私には解決策がありますが、それはかなり醜いです!私のソリューションには、存在するものと存在しないものの2つのユニオンが含まれています。もっと良い方法があると確信していますが、最近はSQLをあまり書かないことを告白しなければなりません。

4

3 に答える 3

3
SELECT c.id, 
       SUM(CASE WHEN m.meetingDate>GetDate() THEN 1 ELSE 0 END) AS Count
FROM clubs c
LEFT JOIN meetings m
    on c.id = m.clubid 
GROUP BY c.id

そして、証拠としてのテストスクリプト(または誰かが上記を改善できる場合に備えて!):

;with clubs(id)
AS
(
    SELECT 1
    UNION SELECT 2
    UNION SELECT 3
    UNION SELECT 4
),
meetings(id, clubid, meetingdate)
AS
(
    SELECT 1,1,CAST('2010-03-01' AS DATE)
    UNION SELECT 2,1,'2010-04-01'
    UNION SELECT 3,2,'2011-05-01'
    UNION SELECT 4,3,'2011-08-01'
    UNION SELECT 5,3,'2012-09-01'
    UNION SELECT 6,3,'2012-08-01'
)
select c.id, SUM(CASE WHEN m.meetingDate>GetDate() THEN 1 ELSE 0 END) AS Count
from clubs c
left join meetings m
on c.id = m.clubid 
group by c.id
于 2012-04-30T13:17:09.273 に答える
1
select c.id, count(m.id) as Count
from Clubs c
  left outer join Meetings m
    on c.id = m.clubid and 
       m.meetingdate > getdate() 
group by c.id
于 2012-04-30T13:23:01.963 に答える
1

私の側の愚かな見落とし。ここ:

Select a.clubid, isnull(b.meetingcount,0) meetingcount    From clubs a
Left outer join (select clubid, count(*) meetingcount
                               From meetings 
                            Where meetingdate>getdate
 Group by clubid) b
On a.clubid=b.clubid
于 2012-04-30T13:20:43.103 に答える