简体   繁体   English

带COUNT个查询的MySQL CASE

[英]MySQL CASE with COUNT query

I asked a similar question before but I realized my desired output is totally different. 之前我问过类似的问题,但是我意识到我想要的输出完全不同。

I have the following query 我有以下查询

SELECT LEVEL, COUNT(*) AS total FROM admin_xxx
GROUP BY LEVEL ORDER BY total DESC LIMIT 10

Table output 表输出

Level  Total
4       27
3       24
7       19
5       10
8       9
6       7
1       5
2       3

Now I just want to rename the actual level with words instead of numbers. 现在,我只想用单词而不是数字来重命名实际级别。

I would like to following as output 我想作为输出

Level     Total
Bronze      27
Silver      24
Gold        19
Gold2       10
Gold3       9
Gold4       7
Gold5       5
Gold6       3

Each 10 levels have a separate level name. 每10个级别都有一个单独的级别名称。

I tried the following but get syntax error 我尝试了以下操作,但语法错误

SELECT LEVEL, COUNT(*) AS total FROM admin_xxx
CASE
WHEN LEVEL = 1 THEN "Bronze",
etc...
WHEN LEVEL = 10 THEN "Gold10"
  END as LEVEL

GROUP BY LEVEL ORDER BY total DESC LIMIT 10

Change your GROUP BY to 将您的GROUP BY更改为

GROUP BY (
    CASE
        WHEN LEVEL = 1 THEN "Bronze",
        etc...
        WHEN LEVEL = 10 THEN "Gold10"
    END
)

You also have syntax error on your SELECT 您的SELECT也有语法错误

SELECT (
    CASE
        WHEN LEVEL = 1 THEN "Bronze",
        etc...
        WHEN LEVEL = 10 THEN "Gold10"
    END
) AS LEVEL
     , COUNT(*) AS total 
FROM admin_xxx
GROUP BY (
    CASE
        WHEN LEVEL = 1 THEN "Bronze",
        etc...
        WHEN LEVEL = 10 THEN "Gold10"
    END
)
ORDER BY total DESC LIMIT 10

you have from clause in the wrong position 您的from子句位置错误

  SELECT 
      CASE
        WHEN LEVEL = 1 THEN "Bronze" 

        WHEN LEVEL = 10 THEN "Gold10"
      END as  LEVEL
    , COUNT(*) AS total 
  FROM admin_xxx
  GROUP BY LEVEL ORDER BY total DESC LIMIT 10

You can also separate yours levels/labels to another table, and you can join these. 您还可以将您的级别/标签分离到另一个表,然后可以将它们连接起来。 For example: 例如:

SELECT levels.level_label, COUNT(*) AS total 
FROM admin_xxx
LEFT JOIN levels ON levels.label_value = admin_xxx.level
GROUP BY levels.level_label ORDER BY total DESC LIMIT 10

And this is the levels table: 这是级别表:

id  level_label     label_value
1   Bronze          10
2   Silver          9
3   Gold            1
4   Gold2           2
5   Gold3           3
6   Gold4           4
7   Gold5           5
8   Gold6           6
9   Gold7           7
10  Gold8           8

TRY THIS: Obviously you should use CASE in the following way to achieve the desired output 尝试一下显然,您应该通过以下方式使用CASE来获得所需的输出

SELECT CASE level 
        WHEN 1 THEN 'Bronze'
        WHEN 2 THEN 'Silver'
        WHEN 3 THEN 'Gold'
        WHEN 4 THEN 'Gold2'
        WHEN 5 THEN 'Gold3'
        WHEN 6 THEN 'Gold4'
        WHEN 6 THEN 'Gold5'
        WHEN 6 THEN 'Gold6'
        ELSE 'Unknown' END Level, 
    COUNT(*) AS total 
FROM admin_xxx
GROUP BY level 
ORDER BY total DESC LIMIT 10

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM