2013-09-18 16 views
10

Potrzebuję połączyć wiele tabel, wybrać liczby z różnych tabel i grupować według jednej kolumny w jednym zapytaniu. To w jaki sposób mogę to zrobić oddzielnie:Dołącz do wielu tabel, wybierz liczby z różnych tabel i grupuj według jednej kolumny w jednym zapytaniu

select  c.CommunityName, SUM(case when m.ListKey = c.ListKey then 1 else 0 end) as Posts 
from  Community c with(NOLOCK) 
join  messages_ m with(NOLOCK) 
on   c.ListKey = m.ListKey 
group by c.CommunityName 

select  c.CommunityName, SUM(case when b.CommunityKey = c.CommunityKey then 1 else 0 end) as Blogs 
from  Community c with(NOLOCK) 
join  Blog b with(NOLOCK) 
on   c.CommunityKey = b.CommunityKey 
group by c.CommunityName 

select  c.CommunityName, SUM(case when ce.CommunityKey = c.CommunityKey then 1 else 0 end) as Events 
from  Community c with(NOLOCK) 
join  CalendarEvent ce with(NOLOCK) 
on   c.CommunityKey = ce.CommunityKey 
where  ce.StartDateTime >= GETDATE() 
group by c.CommunityName 

lub po prostu

select  c.CommunityName, COUNT(*) 
from  Community c with(NOLOCK) 
join  messages_ m with(NOLOCK) 
on   c.ListKey = m.ListKey 
group by c.CommunityName 

select  c.CommunityName, COUNT(*) 
from  Community c with(NOLOCK) 
join  Blog b with(NOLOCK) 
on   c.CommunityKey = b.CommunityKey 
group by c.CommunityName 

select  c.CommunityName, COUNT(*) 
from  Community c with(NOLOCK) 
join  CalendarEvent ce with(NOLOCK) 
on   c.CommunityKey = ce.CommunityKey 
where  ce.StartDateTime >= GETDATE() 
group by c.CommunityName 

istnieje więcej, niektóre tabele, które wymagają dodatkowego łączy ... Czy ktoś może pomóc?

+0

Nie można UNION je wszystkie razem, dodając statyczne pole tekstowe, aby odróżnić każdą grupę? – Joe

+0

Wciąż jestem dzieckiem kreatora SQL;) Sprawdzę UNION. Dzięki! – HLkatie

+0

Jaki powinien być twój wynik? suma wszystkich liczb z różnych zapytań? – Lobo

Odpowiedz

7

Jeśli dobrze rozumiem pytanie, szukasz nazwa grupy wraz z liczbą takich jak posty, blogi, imprezy itp ..

Jak policzyć twoje pytania indywidualnie, dodać obojętne kolumn w SELECT dla innych liczy się, a następnie w końcu UNION je i uzyskać SUM.

SELECT CommunityName , SUM(MessageCount), SUM(BlogCount), SUM(EventCount) 
FROM (
    SELECT  c.CommunityName CommunityName , COUNT(*) MessageCount, 0 BlogCount, 0 EventCount 
    FROM  Community c with(NOLOCK) 
    JOIN  messages_ m with(NOLOCK) 
    ON   c.ListKey = m.ListKey 
    GROUP BY c.CommunityName 

    UNION 

    SELECT  c.CommunityName, 0, COUNT(*), 0 
    FROM  Community c with(NOLOCK) 
    JOIN  Blog b with(NOLOCK) 
    ON   c.CommunityKey = b.CommunityKey 
    GROUP BY c.CommunityName 

    UNION 

    SELECT  c.CommunityName, 0, 0, COUNT(*) 
    FROM  Community c with(NOLOCK) 
    JOIN  CalendarEvent ce with(NOLOCK) 
    ON   c.CommunityKey = ce.CommunityKey 
    WHERE  ce.StartDateTime >= GETDATE() 
    GROUP BY c.CommunityName 
) CountsTable 
GROUP BY CountsTable.CommunityName 

CountsTable będzie wyglądać

| COMMUNITYNAME | MESSAGECOUNT | BLOGCOUNT | EVENTCOUNT | 
|---------------|--------------|-----------|------------| 
|   Name |   10 |   0 |   0 | 
|   Name |   0 |  20 |   0 | 
|   Name |   0 |   0 |   30 | 

Więc można GROUP BY nazwę i zsumować liczbę, aby uzyskać wynik

| COMMUNITYNAME | MESSAGECOUNT | BLOGCOUNT | EVENTCOUNT | 
|---------------|--------------|-----------|------------| 
|   Name |   10 |  20 |   30 | 
+0

Przepraszamy za opóźnienie. Skończyło się na tym, że poprosiłem jednego z naszych geniuszy SQL o pomoc, ale najwyraźniej chciałem spróbować znaleźć odpowiedź. Właśnie to zasugerował! Dziękuję Ci! – HLkatie

+0

Dziękuję bardzo! Utknąłem próbując różnych technik przez 3 godziny, aż spróbowałem tego! –

0

Czy myślałeś o użyciu LEFT JOIN połączyć tabele ? Następnie możesz sprawdzić NULL i podsumować wartości nie-NULL.

SELECT 
    c.CommunityName, 
    SUM(case when m.ListKey IS NOT NULL then 1 else 0 end) as Posts, 
    SUM(case when b.CommunityKey IS NOT NULL then 1 else 0 end) as Blogs, 
    SUM(case when ce.CommunityKey IS NOT NULL then 1 else 0 end) as Events 
FROM 
    Community c WITH(NOLOCK) 
     LEFT JOIN 
    messages_ m WITH(NOLOCK) 
     ON c.ListKey = m.ListKey 
     LEFT JOIN 
    Blog b WITH(NOLOCK) 
     ON c.CommunityKey = b.CommunityKey 
     LEFT JOIN 
    CalendarEvent ce WITH(NOLOCK) 
     ON c.CommunityKey = ce.CommunityKey 
WHERE 
    ce.StartDateTime >= GETDATE() 
GROUP BY 
    c.CommunityName 
Powiązane problemy