【问题标题】:Creating row with different where创建具有不同位置的行
【发布时间】:2021-02-07 14:55:22
【问题描述】:

我有这段代码来获取列表中所有项目的用户数和平均级别。

select  itemId,count(c.characterid) as numberOfUse, avg(maxUpgrade) as averageLevel
from items i inner join characters c on i.characterId=c.characterId 
where itemid in (22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22070,22071,22072,22073,22074,22075,22076,22077,22085,22086,22087,22091,22092) 
and attached>0
group by itemId

它确实是为符文id创建一行,为用户数量创建一行,为升级它的普通人创建一行,它对服务器的所有玩家都这样做。

我想每 10 个关卡创建一个新列,以便每 10 个关卡有统计数据,这样我就可以根据玩家等级查看更常用的物品。项目级别取决于级别,所以我只选择某个级别的方法是使用WHERE itemid>0 and itemid<10,我每10个级别执行一次,复制数据,然后将它们推送到谷歌表格中。

所以我想要一个带有列的结果:

itemid   use_1-10   avg_level_1-10   use_11-20   avg_level_21-30  etc...

所以我可以一次复制所有结果,而不必重复执行 15 次相同的过程。

【问题讨论】:

    标签: sql sql-server count pivot average


    【解决方案1】:

    如果我正确地遵循了这一点,您可以进行条件聚合。假设“级别”存储在表 characters 的列 level 中,您会这样做:

    select i.itemId,
        sum(case when c.level between  1 and 10 then 1 else 0 end) as use_1_10,
        avg(case when c.level between  1 and 10 then maxUpgrade end) as avg_level_1_10,
        sum(case when c.level between 11 and 20 then 1 else 0 end) as use_11_20,
        avg(case when c.level between 11 and 20 then maxUpgrade end) as avg_level_11_20,
        ...
    from items i 
    inner join characters c on i.characterId = c.characterId 
    where i.itemid in (...)  and attached > 0
    group by i.itemId
    

    注意:考虑在where 子句中为列attached 加上它所属的表,以避免歧义。

    【讨论】:

    • 我想这就是我想要的,除了它是characters.level而不是maxUpgrade,我也不明白“then 1 else 0”的真正含义,同样的“then maxUpgrade end”,你能向我解释一下它们的用途?
    • @SamyPereger:每次遇到等级属于给定范围的角色时,sum() 都会增加 (then 1 else 0 end)。这与maxUpgrade 的平均值的逻辑相同:如果玩家的级别属于范围,case 表达式返回 maxUpgrade,否则返回 nullavg() 忽略。
    猜你喜欢
    • 2011-08-24
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多