mySQL:按大小写、分组和排序

mySQL:按大小写、分组和排序,mysql,group-by,sql-order-by,case,Mysql,Group By,Sql Order By,Case,我有一个简单的表格,在这里我存储了一堆股票的市值。我正在尝试创建一个查询,该查询将返回以下内容: cap_type type_count micro 4 small 6 large 1 mega 2 我不知道如何调整此查询以计算不同select案例组中cap_类型的数量。以下是我目前掌握的情况: SELECT CASE WHEN market_cap < 10 THEN 'micro' WHEN market_cap >= 10

我有一个简单的表格,在这里我存储了一堆股票的市值。我正在尝试创建一个查询,该查询将返回以下内容:

cap_type  type_count
micro     4
small     6
large     1
mega      2
我不知道如何调整此查询以计算不同select案例组中cap_类型的数量。以下是我目前掌握的情况:

SELECT CASE
    WHEN market_cap < 10 THEN 'micro' 
    WHEN market_cap >= 10 < 50 THEN 'small' 
    WHEN market_cap >= 50 < 100 THEN 'large' 
    ELSE 'mega' 
END AS cap_type
FROM stocks
GROUP BY CASE
    WHEN market_cap < 10 THEN 'micro' 
    WHEN market_cap >= 10 < 50 THEN 'small' 
    WHEN market_cap >= 50 < 100 THEN 'large' 
    ELSE 'mega' 
    END
ORDER BY cap_type ASC
您可以使用子查询:

SELECT sub.cap_type, COUNT(*) AS type_count
FROM (
    SELECT CASE WHEN market_cap < 10 THEN 'micro' 
                WHEN market_cap < 50 THEN 'small' 
                WHEN market_cap < 100 THEN 'large' 
                ELSE 'mega' 
           END AS cap_type
    FROM temp
) AS sub  
GROUP BY sub.cap_type
ORDER BY 
CASE sub.cap_type
  WHEN 'micro' THEN 1
  WHEN 'small' THEN 2
  WHEN 'large' THEN 3
  ELSE 4
END;

如果您需要所有组,您可以使用子查询列出它们,然后
左键联接

SELECT sub.cap_type, COUNT(t.market_cap) AS type_count
FROM (SELECT 'micro' AS cap_type
      UNION ALL SELECT 'small'
      UNION ALL SELECT 'large' 
      UNION ALL SELECT 'mega') AS sub
LEFT JOIN temp t
  ON CASE
    WHEN t.market_cap < 10 THEN 'micro' 
    WHEN t.market_cap < 50 THEN 'small' 
    WHEN t.market_cap < 100 THEN 'large' 
    ELSE 'mega' 
    END = sub.cap_type
GROUP BY sub.cap_type
ORDER BY 
  CASE cap_type
    WHEN 'micro' THEN 1
    WHEN 'small' THEN 2
    WHEN 'large' THEN 3
    ELSE 4
  END

你试过以下方法吗?还是我理解错了问题

SELECT 
  CASE
    WHEN market_cap < 10 THEN 'micro' 
    WHEN market_cap >= 10 < 50 THEN 'small' 
    WHEN market_cap >= 50 < 100 THEN 'large' 
    ELSE 'mega' 
  END AS cap_type,
  COUNT(*) as count
FROM stocks
GROUP BY cap_type
ORDER BY cap_type ASC;
选择
案例
当市值小于10时,则为“微型”
当市值>=10<50时,则为“小”
当市值>=50<100时,则为“大”
其他“巨型”
端部为cap_类型,
计数(*)作为计数
库存
按cap_类型分组
按cap_类型ASC订购;
UPD:您的案例语句包含细微错误(您遗漏了和,并且条件没有意义,尽管形式上是正确的),下面是正确的查询(当条件停止处理时匹配):

选择
案例
当市值小于10时,则为“微型”
当市值小于50时,则为“小”
当市值<100时,则为“大”
其他“巨型”
端部为cap_类型,
计数(*)作为计数
库存
按cap_类型分组
按cap_类型ASC订购;
选择
案例
当市值小于10时,则为“微型”
当市值>=10且市值<50时,则为“小”
当市值>=50且市值<100时,则为“大”
其他“巨型”
端部为cap_类型,
计数(*)
现货
分组
当市值小于10时,则为“微型”
当市值>=10且市值<50时,则为“小”
当市值>=50且市值<100时,则为“大”
其他“巨型”
结束
按cap_类型ASC订购;

这成功了,谢谢!现在我看看SQL,我可以确切地看到CASE语句在做什么,以及如何/在哪里调用其他字段。@Gunnar,顺便说一句,我复制并粘贴了您的CASE语句,它包含错误,我更新了正确解决方案的答案。
SELECT sub.cap_type, COUNT(t.market_cap) AS type_count
FROM (SELECT 'micro' AS cap_type
      UNION ALL SELECT 'small'
      UNION ALL SELECT 'large' 
      UNION ALL SELECT 'mega') AS sub
LEFT JOIN temp t
  ON CASE
    WHEN t.market_cap < 10 THEN 'micro' 
    WHEN t.market_cap < 50 THEN 'small' 
    WHEN t.market_cap < 100 THEN 'large' 
    ELSE 'mega' 
    END = sub.cap_type
GROUP BY sub.cap_type
ORDER BY 
  CASE cap_type
    WHEN 'micro' THEN 1
    WHEN 'small' THEN 2
    WHEN 'large' THEN 3
    ELSE 4
  END
╔═══════════╦════════════╗
║ cap_type  ║ type_count ║
╠═══════════╬════════════╣
║ micro     ║          1 ║
║ small     ║          1 ║
║ large     ║          2 ║
║ mega      ║          0 ║
╚═══════════╩════════════╝   
SELECT 
  CASE
    WHEN market_cap < 10 THEN 'micro' 
    WHEN market_cap >= 10 < 50 THEN 'small' 
    WHEN market_cap >= 50 < 100 THEN 'large' 
    ELSE 'mega' 
  END AS cap_type,
  COUNT(*) as count
FROM stocks
GROUP BY cap_type
ORDER BY cap_type ASC;
SELECT 
  CASE
    WHEN market_cap < 10 THEN 'micro' 
    WHEN market_cap < 50 THEN 'small' 
    WHEN market_cap < 100 THEN 'large' 
    ELSE 'mega' 
  END AS cap_type,
  COUNT(*) as count
FROM stocks
GROUP BY cap_type
ORDER BY cap_type ASC;
SELECT 
CASE
    WHEN market_cap < 10 THEN 'micro'
    WHEN market_cap >= 10 and market_cap < 50 THEN 'small'
    WHEN market_cap >= 50 and market_cap < 100 THEN 'large'
    ELSE 'mega'
END AS cap_type,
count(*)
FROM stock
GROUP BY CASE
    WHEN market_cap < 10 THEN 'micro'
    WHEN market_cap >= 10 and market_cap < 50 THEN 'small'
    WHEN market_cap >= 50 and market_cap < 100 THEN 'large'
    ELSE 'mega'
END
ORDER BY cap_type ASC;