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 用の 2 つのグループに分けたいと思います。次に、これら 2 つのグループ内で、一方は昇順、もう一方は降順で並べ替えます。これは私ができることです:

(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を取得します...どうすれば合計できますか同じ量と同じ種類の数字の量?

ありがとう

4

3 に答える 3

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 |

SQLフィドル

更新:各タイプのソース レコードの数を制限する必要がある場合は、これを使用します。行の順序が保持されないため、使用する場合は明示的に指定する必要があることに注意してください。LIMITORDER 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;

SQLフィドル

于 2013-05-18T22:03:04.557 に答える
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;

注: これは、 の後にA の 10 行と B の 15 行を返しますgroup by。これがあなたが本当に望んでいることだと思います。

また、group byは で自動的に並べ替えnumberます。ランダムな順序が必要な場合は、group by rand()各サブクエリのlimit.

于 2013-05-18T22:19:36.403 に答える