2015-12-25 38 views
3

我有一個簡單的表格,用於存儲一堆股票的市值。我想看看我是否能創建一個查詢,將返回類似以下內容:mySQL:CASE,GROUP和ORDER By

cap_type type_count 
micro  4 
small  6 
large  1 
mega  2 

我不知道如何調整這個查詢計數的不同選擇病例組cap_types的數量。這是我到目前爲止有:

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 

下面是一些樣本數據:

CREATE TABLE `stocks` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `stock` varchar(4) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `market_cap` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 
INSERT INTO temp (`stock`,`market_cap`) VALUES ('MSFT', 40); 
INSERT INTO temp (`stock`,`market_cap`) VALUES ('MINI', 4); 
INSERT INTO temp (`stock`,`market_cap`) VALUES ('GOOG', 50); 
INSERT INTO temp (`stock`,`market_cap`) VALUES ('F', 90); 

回答

1

您是否嘗試過以下方法?或者我理解錯誤的問題?

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; 

UPD:你的CASE語句包含細微的錯誤(你錯過了AND和條件沒有任何意義,雖然在形式上是正確的),這裏是正確的查詢(匹配有條件時停止處理):

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; 
+0

這並獲得成功,謝謝!現在我看看SQL,我可以看到CASE語句正在做什麼以及如何/在哪裏調用其他字段。 – Gunnar

+0

@Gunnar,順便說一句,我複製並粘貼了您的CASE語句,並且它包含錯誤,我更新了答案與正確的解決方案。 – newtover

1

您可以使用子查詢:

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; 

SqlFiddleDemo

或只添加COUNT(*)您existsing查詢:

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 type_count 
FROM temp 
GROUP BY CASE WHEN market_cap < 10 THEN 'micro' 
       WHEN market_cap < 50 THEN 'small' 
       WHEN market_cap < 100 THEN 'large' 
       ELSE 'mega' 
      END 
ORDER BY 
CASE cap_type 
    WHEN 'micro' THEN 1 
    WHEN 'small' THEN 2 
    WHEN 'large' THEN 3 
    ELSE 4 
END 

如果你需要的所有組可以使用子查詢列出他們LEFT JOIN

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 

SqlFiddleDemo2

輸出:

╔═══════════╦════════════╗ 
║ cap_type ║ type_count ║ 
╠═══════════╬════════════╣ 
║ micro  ║   1 ║ 
║ small  ║   1 ║ 
║ large  ║   2 ║ 
║ mega  ║   0 ║ 
╚═══════════╩════════════╝ 
1
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; 

SQLFiddle.