質問させて頂きます。
DB:PostgresSQL
言語:PHP
現在仕事情報の入ったテーブルから、金額の高い順にデータを10件取り出したいと考えています。
金額の入ったカラムが1つであれば、order by句で取り出すのですが、今回、時給[hour]、月給[month]、年収[year]と3つのカラムが存在しています。
※下記のid4のように2つ以上の金額情報カラムを持っているデータも存在します。
※データの中にはnullでなく0が入っているデータも存在します。
[id][hour][month][year]
1 ,1000 ,null ,null
2 ,1200 ,0 ,0
3 ,null ,300000 ,null
4 ,1500 ,200000 ,null
5 ,null ,null ,3200000
...
100,null ,250000 ,null
質問の内容なのですが、下記のルールに従いデータを取得する際、どのような方法を行えば一番効率的でしょうか。
「ルール」
1.
金額比較の際、
月給はそのまま、
年収は12で割った金額、
時給に関しては、時給×8(1日の平均的労働時間)×20(1月の平均的な労働日数)の金額とします。
2.
2つ以上のカラムに金額を持っていた際は(id4のようなデータ)、金額の大きさに関わらず、年収>月給>時給の順で取得する。
id4のデータならば、時給の方が月給より高いですが、月給のデータを使用します。年収があれば年収優先。
id2の場合、0はnullと同じ扱いと考え、時給のデータを使用します。
このルールをふまえたうえでデータを取得する際、SQLで全データを取得して、PHPで高い順を判定するべきか、SQLで取得する時点である程度絞って取得した方が良いのか・・・。
SQLに関しての知識が乏しいため、効率的な方法をご存知の方はアドバイス頂けると大変助かります。
よろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
未テストですが、以下のような感じはどうでしょう?
select case
when year >= month
then year
else
(case
when month >= hour
then month
else hour
end
)
end as money
from
(select COALESCE(year,0) / 12 as year ,
COALESCE(month,0) as month ,
COALESCE(hour,0) * 8 * 20 as hour
from table
)
order by money desc
No.1
- 回答日時:
ムリ。
というか、NULLと0の扱いが一緒ならNULLがなければいいと思うんですが。
NULLがあるせいで凄いごりごりしないと
いけないですね。
結論的に、どうしてもNULLが必要ならNULLは
見直さなくてもいいけど、DB設計を見直すのが
早いでしょう。
データが登録されるタイミングで、ソート用の
列があれば楽です。
算数、NULLを0に置換済みの列を設けて、それを
インデックスにしてソートすればいいです。
考えるのがめんどいので、今の設計上での
実現方法は他の方におまかせです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 年末調整 令和4年分 給与所得者の基礎控除申告書 兼 給与所得者の配偶者控除等申告書 兼所得金額調整控除申告書 3 2022/11/04 03:46
- 経済 ドイツ人の平均可処分所得は2017年頃2万2657€(当時レートで290万円)でしたが今いくら? 3 2022/10/06 21:40
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- 所得税 個人年金の受け取り時・所得税についての相談です 5 2023/04/21 14:36
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- 福祉 児童扶養手当の支給額について質問です。 収入は障害年金(障害基礎年金、障害厚生年金ともに2級)で、 1 2023/07/29 13:02
- 所得税 所得税額の決定時期について 毎年決まる所得税の金額について、4月~6月の所得額の平均で決まると聞いた 3 2023/01/28 14:58
- 年末調整 令和4年分 給与所得者の基礎控除申告書 兼 給与所得者の配偶者控除等申告書 兼所得金額調整控除申告書 5 2022/11/03 07:26
- 所得税 非課税対象給付金について 3 2022/10/17 13:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLServerでNULLを挿入したいです
-
type date にnullをinsert
-
DBエラーの意味
-
LIKEの右側にカラムを指定でき...
-
MySQL AUTO_INCREMENTが最大に...
-
スペースによる絞り込み検索をS...
-
SQLステータス:37000について
-
一部のカラムでdistinctし全て...
-
whereで全てを検索する方法
-
WHEREなどの条件が多い場合、ど...
-
フレンドリストのようなものを...
-
now()かCURRENT_TIMESTAMPか
-
End Ifに対応するIfブロックが...
-
複数カラムに対するLIKE文の最適化
-
UNIONする際、片方テーブルしか...
-
INDIRECT関数の代替方法は?
-
Select文で結合した時に、重複...
-
SQL Serverのntext型で一意イン...
-
エクセルかワードで家系図を作...
-
場合の数 中学入試 5枚のカード
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLServerでNULLを挿入したいです
-
type date にnullをinsert
-
JDBCドライバがない?
-
insert、selectのやり方を教え...
-
SQL,値の大きい順に値を取得
-
SQLServer 複数列から同一語を検索
-
INDIRECT関数の代替方法は?
-
一部のカラムでdistinctし全て...
-
テーブルの列数を調べたい
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
now()かCURRENT_TIMESTAMPか
-
LIKEの右側にカラムを指定でき...
-
UNIONする際、片方テーブルしか...
-
BULK INSERT時のNull許容について
-
MYSQLで全てのカラムから検索す...
-
GREATESTで NULLをスルーする方...
-
構造が異なる二つのテーブルをu...
-
group byで最後のレコードを抽...
-
カラムをコピーして、新規カラ...
おすすめ情報