SQL:给定列的最多行数(从列列表中)

问题描述 投票:0回答:2

我刚开始学习SQL(特别是SQLite),我一直在玩this数据。

此列表中的每个漫威角色都对每个属性(力量,智力,速度等)进行评级。我想找到每个属性最多的角色。例如,有多少个字符具有作为其最大属性的强度?

我们可以假设,如果一个角色有两个或更多属性作为最高属性,那么该角色将计入每个属性。

我期待的输出是这样的:

best_Attribute      COUNT(*)
__________________________________
intelligence            a
strength                b
speed                   c
durability              d
energy_Projection       e
fighting_Skills         f

这是我的尝试:

SELECT COUNT(*),
    CASE
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == intelligence THEN "intelligence"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == strength THEN "strength"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == speed THEN "speed"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == durability THEN "durability"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == energy_Projection THEN "energy_Projection"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == fighting_Skills THEN "fighting_Skills"
    END as "best_Attribute"
FROM marvels
GROUP BY best_Attribute;

这是丑陋的,冗长的,甚至不起作用。这是输出:

COUNT(*)    best_Attribute
__________________________
    2               4
    3               6
    7               7

是否有(好的)获得所需输出的方法?

sql sqlite select
2个回答
2
投票

我不确定您是否需要确切的建议输出。我可以提供以下查询,该查询将整个表的属性计数报告为单独的列。

SELECT
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = intelligence THEN 1 END) AS intelligence_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = strength THEN 1 END) AS strength_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = speed THEN 1 END) AS speed_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = durability THEN 1 END) AS durability_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = energy_Projection THEN 1 END) AS energy_Projection_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = fighting_Skills THEN 1 END) AS fighting_Skills_count
FROM marvels;

请注意,如果您想要整个表格的总计,则无需在此处使用GROUP BY


1
投票

蒂姆的解决方案是最高效的方法 - 以及您如何处理问题。但是,另一种方法是取消数据的使用并使用聚合。我只想提供这个作为替代方案,以便您可以在SQL中看到解决问题的不同方法:

with a as (
      select name, 'intelligence' as attribute, intelligence as val
      from marvels
      union all
      select name, 'strength' as attribute, strength as val
      from marvels
      union all
      select name, 'speed' as attribute, speed as val
      from marvels
      union all
      select name, 'durability' as attribute, durability as val
      from marvels
      union all
      select name, 'energy_Projection' as attribute, energy_Projection as val
      from marvels
      union all
      select name, 'fighting_Skills' as attribute, fighting_Skills as val
      from marvels
     )
select a.attribute, count(*) as num_with_max
from a
where a.val = (select max(a2.val) from a a2 where a2.name = a.name)
group by a.attribute;
© www.soinside.com 2019 - 2024. All rights reserved.