1

これに数時間取り組んできましたが、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$$

市、州、および国を指定して、各製品とベンダーの組み合わせの平均レートの最適な見積もりを出す必要があります。各ベンダーは、異なる数の製品を持つことができます。また、各都市のベンダーの数は異なる場合があります。ロジックは

  1. 一致が見つかった場合、都市、州、および国に一致するレコードのデータを返します。
  2. 一致するものが見つからない場合は、州と国に基づいて結果を見つけてみてください。
  3. それでも何も返されない場合は、国のみに基づいて結果を検索します
  4. 最後の手段として、すべてのレコードを使用して、各製品、ベンダーの組み合わせの平均レートを算出します
  5. 他の列には追加のロジックがありますが、それらはすべて場所と同じパターンに従います。

最初のクエリは次のようになります

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);

何か不足している場合はお知らせください。必要に応じて詳細を追加します。

ありがとうございました

4

3 に答える 3

1

これが可能な解決策です。3 つの方法すべてを照会し、LIMIT を使用して一致する最初の方法を取得します。

SELECT * FROM (
 (SELECT SUM(population) AS population, city, state, country
  FROM POPULATION
  WHERE (city, state, country) = (?, ?, ?))
 UNION ALL
 (SELECT SUM(population), NULL, state, country
  FROM POPULATION
  WHERE (state, country) = (?, ?))
 UNION ALL
 (SELECT SUM(population), NULL, NULL, country
  FROM POPULATION
  WHERE (country) = (?))) AS t
WHERE t.population IS NOT NULL
LIMIT 1;
于 2013-02-14T19:40:15.827 に答える
0

これにより、適切な結果が得られるはずです(要件が適切である場合)。ただし、exect都市が見つかった場合でもすべてのオプションが計算されるため、効率的ではありません。

SELECT 
  (city = 'Boston') * rate AS exactCityData, 
  SUM((city != 'Boston' AND state = 'MA') * rate) AS wholeStateData, 
  SUM((city != 'Boston' AND state != 'MA' AND country = 'United States') * rate) AS wholeCountryData
WHERE country = 'United States'
GROUP BY vendor, product;

状態平均の場合、クエリは(国の)すべての行に一致するため、AVGを使用できません。したがって、クエリは次のようになります。

SELECT 
  (city = 'Boston') * rate AS exactCityData, 
  SUM((state = 'MA') * rate) / SUM(state = 'MA') AS wholeStateData, 
  AVG(rate) AS wholeCountryData
WHERE country = 'United States'
GROUP BY vendor, product;

AVG(rate) AS wholeCountryData次に、5番目の「最後の手段」オプションとして、国の要件を削除し、一部を次のように置き換えます。SUM((country = 'United States') * rate) / SUM(country = 'United States') AS wholeCountryData

于 2013-02-14T21:38:40.897 に答える
0

1つの方法は次のとおりです。

CREATE TABLE `population` (
  `city` varchar(64) NOT NULL,
  `state` varchar(64) NOT NULL,
  `country` varchar(64) NOT NULL,
  `population` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

および選択クエリ:

SELECT city, state, country, population
  FROM population
 WHERE country = '<country>' AND state = '<state>' AND city = '<city>'
UNION
SELECT null, state, country, sum(population)
  FROM population
 WHERE country = '<country>' AND state = '<state>'
 GROUP BY state
UNION
SELECT null, null, country, sum(population)
  FROM population
 WHERE country = '<country>'
 LIMIT 1;
于 2013-02-14T19:44:21.287 に答える