用不同的位置创建行

Creating row with different where

我有这段代码可以获取列表中所有项目的用户数和平均水平。

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 级有一个统计数据,这样我就可以根据玩家级别查看更常用的项目。项目级别取决于级别,所以我对 select 只有特定级别的方法是使用 WHERE itemid>0 and itemid<10,我每 10 个级别执行一次,复制数据,并将它们推送到 [=23] =] sheet.

所以我想要一个包含列的结果:

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

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

如果我没听错,你可以进行条件聚合。假设“级别”存储在 table characterslevel 列中,您将执行:

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 添加它所属的 table 前缀,以避免歧义。