Как добавить счетчик на основе двух столбцов в выборе с большим количеством столбцов - PullRequest
0 голосов
/ 16 июня 2020

Я хочу добавить столбец «count_I_R» в приведенный ниже оператор выбора.

SELECT g.[Id], 
            g.[FirstName], 
            g.[LastName], 
            g.[Email],
            g.[Count_Invited],
            g.[Count_Registered],
            r.[DateReservation],
            r.[AmountPersons],
            row_number() over(order by g.[Count_Invited], g.[Count_Registered] DESC) AS seqnum
    FROM Users g 
        INNER JOIN Reservation r ON r.[UserId] = g.[Id]
    WHERE r.[EventId] = 21

Подсчет должен быть основан на g. [Count_Invited] и g . [Count_Registered] .

Результат должен быть примерно таким:

result

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Вы можете использовать COUNT с предложением OVER, чтобы разделить счетчик строк с теми же значениями Count_Invited и Count_Registered .

SELECT g.[Id], 
            g.[FirstName], 
            g.[LastName], 
            g.[Email],
            g.[Count_Invited],
            g.[Count_Registered],
            r.[DateReservation],
            r.[AmountPersons],
            row_number() over(order by g.[Count_Invited], g.[Count_Registered] DESC) AS seqnum,
            count(*) over (partition by g.[Count_Invited], g.[Count_Registered]) as count_I_R
    FROM Users g 
        INNER JOIN Reservation r ON r.[UserId] = g.[Id]
    WHERE r.[EventId] = 21

См. Пример B в документации:

0 голосов
/ 16 июня 2020

Для этого вам нужно использовать DENSE_RANK:

SELECT g.[Id], 
            g.[FirstName], 
            g.[LastName], 
            g.[Email],
            g.[Count_Invited],
            g.[Count_Registered],
            r.[DateReservation],
            r.[AmountPersons],
            Dense_rank() over(order by g.[Count_Invited], g.[Count_Registered] DESC) AS seqnum
    FROM Users g 
        INNER JOIN Reservation r ON r.[UserId] = g.[Id]
    WHERE r.[EventId] = 21

Ниже приведен пример, который я пробовал:

DECLARE @table table(invited int, registered int)

insert into @table VALUES(0,3), (0,1), (0,1), (1,2),(1,2),(1,2),(1,2),(1,2),(1,1),(1,1);

SELECT invited,registered, dense_rank() over(order by invited, registered desc) as seqnum
from @table
+---------+------------+--------+
| invited | registered | seqnum |
+---------+------------+--------+
|       0 |          3 |      1 |
|       0 |          1 |      2 |
|       0 |          1 |      2 |
|       1 |          2 |      3 |
|       1 |          2 |      3 |
|       1 |          2 |      3 |
|       1 |          2 |      3 |
|       1 |          2 |      3 |
|       1 |          1 |      4 |
|       1 |          1 |      4 |
+---------+------------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...