2013-05-18 51 views
1

有一個順序試想一下,這是我表中的數據:如何總結這些分組的行還通過

Amount/ Number /Type 
100/ 1.2/A 
120/1.2 /A 
130/ 1.1/A 
90/0.3/A 
50/ 2.4/B 
150/1.9 /B 
150/1.9/B 

我想這個數據在兩組一個A型,一個是B型。然後,這兩個羣體中,我希望他們通過價格排序,升一降的其他。這個我可以這樣做:

(SELECT * FROM `table` WHERE `type`='A' GROUP BY `number` LIMIT 10) 
UNION ALL 
(SELECT * FROM `table` WHERE `type`='b' GROUP BY `number` LIMIT 15) ORDER BY `type`), 
(CASE WHEN `type`='A' THEN `number` END) ASC, 
(CASE WHEN `type`='B' THEN `number` END) DESC"; 

但是問題是我想加起來類型相同數量的..所以1.2我會得到220/1.2/A,而是與我的查詢我只是得到100 /1.2/A ...如何合計相同數量和相同類型的數字金額?

感謝

+0

請根據提供的示例數據顯示所需的輸出 – peterm

回答

1

這是您要查詢:

(SELECT sum(amount) as amount, number, type 
FROM `table` 
WHERE `type`='A' 
GROUP BY `number` LIMIT 10 
) 
UNION ALL 
(SELECT sum(amount) as amount, number, type 
FROM `table` 
WHERE `type`='b' 
GROUP BY `number` LIMIT 15 
) 
ORDER BY `type`, 
      (CASE WHEN `type`='A' THEN `number` END) ASC, 
      (CASE WHEN `type`='B' THEN `number` END) DESC; 

作爲一個說明:這將返回的10行的group by後15行乙的。我猜這就是你真正想要的。

此外,group by會自動number訂購。如果你想有一個隨機的順序,再加入group by rand()limit之前每個子查詢。

+0

Upvoted。謝謝.... – user1796995

+0

@ user1796995。 。 。你意識到這個答案和你接受的答案是有區別的。該解決方案返回25行,10個「A」和15個「B」。該解決方案總結了10行「A」和15個「B」。最終的行數可能小於25.你不清楚你想要哪個版本,但有一個區別。 –

+0

謝謝Gordon指出。你的解釋是我想要的答案。我已經選擇了你的答案(對不起,彼得)。 – user1796995

2

你在找這個?

SELECT SUM(amount) amount, number, type 
    FROM table1 
GROUP BY type, number 
ORDER BY type, 
     CASE WHEN `type`='A' THEN `number` END ASC, 
     CASE WHEN `type`='B' THEN `number` END DESC; 

輸出:

| AMOUNT | NUMBER | TYPE | 
-------------------------- 
|  90 | 0.3 | A | 
| 130 | 1.1 | A | 
| 220 | 1.2 | A | 
|  50 | 2.4 | B | 
| 300 | 1.9 | B | 

SQLFiddle

UPDATE:如果您需要限制每種類型的使用這種源的記錄數。 注意,當您使用LIMIT,你必須明確說明ORDER BY因爲行的順序不保留。

SELECT SUM(amount) amount, number, type 
FROM (
    (SELECT * FROM table1 WHERE type = 'A' ORDER BY number LIMIT 10) 
    UNION ALL 
    (SELECT * FROM table1 WHERE type = 'B' ORDER BY number LIMIT 15) 
) q 
GROUP BY type, number 
ORDER BY type, 
     CASE WHEN `type`='A' THEN `number` END ASC, 
     CASE WHEN `type`='B' THEN `number` END DESC; 

SQLFiddle

+0

感謝您期望的輸出,但是我需要查詢結構來保留'union'我認爲,因爲我想限制在位(限制15和限制10 )..除非你能看到另一種方式 – user1796995

+0

@ user1796995見更新的答案。請注意,如果使用'LIMIT',則必須明確使用'ORDER BY',因爲行的順序不會被保留 – peterm

+0

謝謝,但在更新後的答案中,mysql會給出錯誤'每個派生表都必須有自己的別名'。另外,在「group by」之前,'q'是什麼? – user1796995

0

像這樣的事情吧?

select Number,Type,sum(Amount) from x group by Number,Type 
+--------+------+--------+ 
| Number | Type | sum(a) | 
+--------+------+--------+ 
| 0.3 | A |  90 | 
| 1.1 | A | 130 | 
| 1.2 | A | 220 | 
| 1.9 | B | 300 | 
| 2.4 | B |  50 | 
+--------+------+--------+ 
5 rows in set (0.00 sec) 
+0

謝謝,但我也需要納入2個不同的限制條件(限制10和限制15) – user1796995

相關問題