アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記の「テーブル1」から、

テーブル1
商品名|価格
------------
AAAAAA|1000
AAAAAA|1200
AAAAAA|1500
BBBBBB|2100
BBBBBB|2600
CCCCCC|2000
DDDDDD|3000
EEEEEE|6000
EEEEEE|6000
EEEEEE|7000
EEEEEE|7500

下記のように出力するにはどのようにSQLを書いたらいいでしょうか。

商品名|価格|通番
------------------
AAAAAA|1000|1
AAAAAA|1200|2
AAAAAA|1500|3
BBBBBB|2100|1
BBBBBB|2600|2
CCCCCC|2000|1
DDDDDD|3000|1
EEEEEE|6000|1
EEEEEE|6000|2
EEEEEE|7000|3
EEEEEE|7500|4

要するに、「商品名」ごとに、「価格」で昇順にソートして「通番」をつけたいのです。

なお、上記「EEEEEE」には価格が6000のレコードが2つありますが、「通番」はそれぞれ1と2をふっています。
このように、価格が同じレコードがある場合にもカウントアップさせて通番を付与したいです。


ご回答よろしくお願い致します。

A 回答 (1件)

せめてテーブル1にユニークなIDがあれば別ですが


今のままでは
EEEEEE|6000
EEEEEE|6000

が同じデータなので、冗長な処理でしかできませんね。
ORDER BYでソートしたものに順位を振るのはナンセンスだと思います。

論点は2点。
1、同じデータは同じ順位でよいならIDはいらない
SELECT
(
SELECT COUNT(*)+1
FROM テーブル1 AS T2
WHERE T2.価格 < T1.価格
AND T2.商品名 = T1.商品名
) AS 通番
,`T1`.*
FROM テーブル1 AS T1

2、ユニークなidを振ってある場合は通し番号も可能

SELECT
(
SELECT COUNT(*)+1
FROM テーブル1 AS T2
WHERE (T2.価格 < T1.価格
OR T2.価格 = T1.価格 AND T2.ID < T1.ID)
AND T2.商品名 = T1.商品名
) AS 通番
,`T1`.*
FROM テーブル1 AS T1
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す