SQL-запрос, чтобы получить значение, которое появилось больше всего для каждой категории - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть такая таблица:

Category    Reply
---------+---------------+
M             1                
F             2                
M             1                
M             3             
M             1                
M             3                
F             2                
F             1                
F             2             
F             5
F             2

Я ищу SQL-запрос для получения следующих результатов:

Category   Total Number    Best Reply           Number
---------+---------------+------------------+---------------+
M             5                  1                 3
F             6                  2                 4

Общее число: числопоявления этой категории (я знаю, как это получить)

Лучший ответ: Ответ, который был выбран наиболее для этой категории

Число: Количество раз, когда "лучший ответ" былвыбран

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Вы не указываете свою базу данных, поэтому я избегал использования общих табличных выражений, которые сделали бы это более понятным.Это все еще можно немного почистить.Я сделал свою работу на SQL Server 2008.

select  rsTotalRepliesByCategory.Category, 
        TotalRepliesByCategory,
        rsCategoryReplyCount.Reply,
        rsMaxReplies.MaxReplies
from
(
    --calc total replies
    select  Category, COUNT(*) as TotalRepliesByCategory
    from CategoryReply
    group by Category
) rsTotalRepliesByCategory
INNER JOIN
(
    --calc number of replies by category and reply
    select Category, Reply, COUNT(*) as CategoryReplyCount
    from CategoryReply
    group by Category, Reply
) rsCategoryReplyCount on rsCategoryReplyCount.Category = rsTotalRepliesByCategory.Category
INNER JOIN 
(
    --calc the max replies
    select Category, MAX(CategoryReplyCount) as MaxReplies
    from
    (
        select Category, Reply, COUNT(*) as CategoryReplyCount
        from CategoryReply
        group by Category, Reply
    ) rsCategoryReplyCount2
    group by Category
) rsMaxReplies on  rsMaxReplies.Category = rsTotalRepliesByCategory.Category and rsMaxReplies.MaxReplies = rsCategoryReplyCount.CategoryReplyCount

Вот настройки, которые я использовал для этого:

create table CategoryReply
(
    Category char(1),
    Reply int
)

insert into CategoryReply values ('M',1)
insert into CategoryReply values ('F',2)
insert into CategoryReply values ('M',1)
insert into CategoryReply values ('M',3)
insert into CategoryReply values ('M',1)
insert into CategoryReply values ('M',3)
insert into CategoryReply values ('F',2)
insert into CategoryReply values ('F',1)                
insert into CategoryReply values ('F',2)
insert into CategoryReply values ('F',5)
insert into CategoryReply values ('F',2)

И, наконец, вывод:

Category    TotalRepliesByCategory  Reply   MaxReplies
F   6   2   4
M   5   1   3
0 голосов
/ 14 ноября 2011
SELECT    Category, TotalNumber, Row_Number() over (order by TotalNumber)
FROM(

    SELECT Category, Sum(Reply) as TotalNumber,  Count(Reply) as Number
    From Table
    Group By Category) as temp

Было бы что-то подобное

...