2

私はそのようなテーブルを持っています:

| B | 1 |
| C | 2 |
| B | 2 |
| A | 2 |
| C | 3 |
| A | 2 |

取得したいのですが、並べ替えてグループ化しました。つまり、文字でグループ化したいのですが、グループの最高額でソートします。また、グループ内のすべてのエントリを表示したいと思います。

| C | 3 |
| C | 2 |
| A | 2 |
| A | 2 |
| B | 2 |
| B | 1 |

Cには3と2があるため、順序はそのようになります。3+ 2 = 5は、Aの2 + 2 = 4よりも高く、Bの2 + 1=3よりも高くなります。

すべての「グループ化された」文字を表示する必要があります。これは、表示する必要のあるすべてが異なる他の列があるためです。

編集:

早速のお返事ありがとうございます。しかし、私にはさらに質問する大胆さがあります。

私はこのクエリを持っています:

SELECT * FROM `ip_log` WHERE `IP` IN
(SELECT `IP` FROM `ip_log` GROUP BY `IP` HAVING COUNT(DISTINCT `uid`) > 1)
GROUP BY `uid` ORDER BY `IP`

上の説明の文字はip(IPアドレスでグループ化する必要があります)、数字はtimestamp(合計で並べ替える必要があります(または並べ替えパラメーターとして使用する必要があります))。一時テーブルを作成してから、以下のソリューションを使用する必要がありますか?

4

2 に答える 2

8
select t.Letter, t.Value
from MyTable t
inner join (
    select Letter, sum(Value) as ValueSum
    from MyTable
    group by Letter
) ts on t.Letter = ts.Letter
order by ts.ValueSum desc, t.Letter, t.Value desc

SQLフィドルの例

于 2012-08-09T21:36:31.220 に答える
0

テーブルの列がletternumberである場合、これを実行する方法は次のようになります。

SELECT
    letter,
    GROUP_CONCAT(number ORDER BY number DESC),
    SUM(number) AS total
FROM table
GROUP BY letter
ORDER BY total desc

あなたの例に基づいてあなたが得るものは次のとおりです:

| C | 3,2 | 5
| A | 2,2 | 4
| B | 2,1 | 3

次に、そのデータを処理して、必要な実際の情報を取得できます。

最初に要求した形式のデータが引き続き必要な場合は、単一のクエリでは不可能です。numberその理由は、同じクエリ(列のSUM)で計算していない集計データに基づいて並べ替えることができないためです。したがって、それを計算して元のクエリにフィードバックするためにサブクエリを作成する必要があります(免責事項:テストされていないクエリ):

SELECT
    letter,
    number
FROM table
     JOIN (SELECT ltr, SUM(number) AS total FROM table GROUP BY letter) AS totals
          ON table.letter = totals.ltr
ORDER BY totals.total desc, letter desc, number desc
于 2012-08-09T21:42:13.590 に答える