これに数時間取り組んできましたが、SQL でこれに対する推奨される解決策があるかどうか、またはこれをデータベースではなくアプリケーション ロジックに配置する方がよいかどうか疑問に思います。私は前者の方がいいです。
CREATE TABLE `rate_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`city` varchar(100) DEFAULT NULL,
`rate_type` varchar(45) DEFAULT NULL,
`rate` int(11) DEFAULT NULL,
`vendor` varchar(45) DEFAULT NULL,
`product` varchar(45) DEFAULT NULL,
`days_to_pickup` int(11) DEFAULT NULL,
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`state` varchar(45) DEFAULT NULL,
`country` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=787 DEFAULT CHARSET=latin1$$
市、州、および国を指定して、各製品とベンダーの組み合わせの平均レートの最適な見積もりを出す必要があります。各ベンダーは、異なる数の製品を持つことができます。また、各都市のベンダーの数は異なる場合があります。ロジックは
- 一致が見つかった場合、都市、州、および国に一致するレコードのデータを返します。
- 一致するものが見つからない場合は、州と国に基づいて結果を見つけてみてください。
- それでも何も返されない場合は、国のみに基づいて結果を検索します
- 最後の手段として、すべてのレコードを使用して、各製品、ベンダーの組み合わせの平均レートを算出します
- 他の列には追加のロジックがありますが、それらはすべて場所と同じパターンに従います。
最初のクエリは次のようになります
select avg(rate) rate, vendor, product from rate_info
where city = 'Boston'
and state = 'MA'
and country = 'United States'
and rate_type = 'REGULAR'
and days_to_pickup >= 4
group by vendor, product
COALESCE、CASE、IFNULL で遊んでいますが、クエリを実行できません。アプリケーション層でそれを行うことができますが、最初のケースが満たされない可能性が高いため、データベースに対して複数の呼び出しを行う必要があります。
理想的な解決策は次のようなものです
COALESCE(select_city_state_cntr, select_state_cntry, select_cntry);
何か不足している場合はお知らせください。必要に応じて詳細を追加します。
ありがとうございました