Несколько COUNT (*) с объединением - PullRequest
1 голос
/ 06 декабря 2011

Мне нужно СЧИТАТЬ несколько строк из нескольких таблиц.Прежде чем я смогу сделать несколько COUNT, мне придется выбрать.Проблема здесь в том, что мне нужно присоединиться к некоторым значениям, чтобы получить правильный результат.

SELECT
    sponsor.Name As SponsorName,
    COUNT(participants.[Table]) AS ParticipantCount,
    (   SELECT 
            COUNT(guestcards.[Table])
        FROM
            guestcards
        WHERE
            guestcards.EventID = @EventID
            AND
            guestcards.[Table] = @Table
            AND
            guestcards.SponsorID = participants.SponsorID
            -- Here lies the problem. 
            -- I will need to check up on another value to ensure I get the right rows, but  participants.SponsorID is not here because of no join :-(

    )  AS GuestParticipantCount
FROM
    participants
    LEFT JOIN
        sponsor
    ON
        sponsor.ID = participants.SponsorID
WHERE
    participants.EventID = @EventID
    AND
    participants.[Table] = @Table
GROUP BY
    sponsor.Name

В таблице гостевых карточек хранится: спонсор, вечерняя, имя таблицы

В таблице участников хранится: спонсор, вечерняя, имя таблицы

В таблице спонсора хранится: идентификатор, имя

Мне нужно посчитать, сколько «Участников» существует и сколько «Гостевых карт» в конкретном событии.У этих участников есть стол (за которым они должны сидеть) и гостевые карты.Мне нужно проверить, если это тот же «стол», где они сидят.

Итак, мне нужно посчитать, сколько людей сидит за столом «А1» или за столом «А2» и т. Д.

Результат, который я получаю, выглядит так:

«У Спонсора Имени 5 участников и 3 гостевые карты. Они сидят на А1»

Надеюсь, я все прояснил

1 Ответ

2 голосов
/ 06 декабря 2011

Вот точный эквивалент вашего запроса (группировка по sponsor.Name):

SELECT  sponsor.name,
        COALESCE(SUM(participantCount), 0),
        COALESCE(SUM(guestcardsCount), 0)
FROM    (
        SELECT  sponsorId, COUNT(*) AS participantCount
        FROM    participants
        WHERE   eventId = @eventId
                AND [table] = @table
        GROUP BY
                sponsorId
        ) p
FULL JOIN
        (
        SELECT  sponsorId, COUNT(*) AS guestcardsCount
        FROM    guestdcards
        WHERE   eventId = @eventId
                AND [table] = @table
        GROUP BY
                sponsorId
        ) g
ON      g.sponsorId = p.sponsorId
FULL JOIN
        sponsor s
ON      s.id = COALESCE(p.sponsorId, g.sponsorId)
GROUP BY
        s.sponsorName

Однако я считаю, что вы хотите что-то более простое:

SELECT  sponsorName, participantCount, guestcardsCount
FROM    sponsor s
CROSS APLLY
        (
        SELECT  COUNT(*) AS participantCount
        FROM    participants
        WHERE   sponsorId = s.id
                AND eventId = @eventId
                AND [table] = @table
        ) p
CROSS APLLY
        (
        SELECT  COUNT(*) AS guestcardsCount
        FROM    guestdcards
        WHERE   sponsorId = s.id
                AND eventId = @eventId
                AND [table] = @table
        ) g

Обновление:

SELECT  sponsor.name,
        COALESCE(participantCount, 0),
        COALESCE(guestcardsCount, 0)
FROM    (
        SELECT  sponsorId, COUNT(*) AS participantCount
        FROM    participants
        WHERE   eventId = @eventId
                AND [table] = @table
        GROUP BY
                sponsorId
        ) p
FULL JOIN
        (
        SELECT  sponsorId, COUNT(*) AS guestcardsCount
        FROM    guestdcards
        WHERE   eventId = @eventId
                AND [table] = @table
        GROUP BY
                sponsorId
        ) g
ON      g.sponsorId = p.sponsorId
JOIN    sponsor s
ON      s.id = COALESCE(p.sponsorId, g.sponsorId)
...