2012-01-06 14 views
1

私はこのMySQLクエリを正しく取得できないようです。私のテーブルには、小売店の年間在庫データが含まれています。ここではテーブルスキーマです:MySQLのクエリ - 2つの異なる年からデータを取得する

CREATE TABLE IF NOT EXISTS `inventory_data` (
inventory_id int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, 
store_id smallint unsigned NOT NULL, 
inventory_year smallint unsigned NOT NULL, 
shortage_dollars decimal(10,2) unsigned NOT NULL 
) 
engine=INNODB; 

すべてのストアが(いくつかの非関連のフィールドは削除)この表の地区に割り当てられている:私は、不足金額を取得することができるようにしたい

CREATE TABLE IF NOT EXISTS `stores` (
store_id smallint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, 
district_id smallint unsigned not null 
) 
engine=INNODB; 

所与の地区内のすべての店舗で2年間インベントリが完了すると、各店舗のインベントリデータはinventory_dataテーブルにのみ追加されるため、ある地区内のすべての店舗がすべて常に表示されるわけではありません。

このクエリは、指定した年の指定された地区内の全店舗の在庫データを返すように動作します(例:2012年の1区にある店舗):

SELECT stores.store_id, inventory_data.shortage_dollars 
FROM stores 
LEFT JOIN inventory_data ON (stores.store_id = inventory_data.store_id) 
AND inventory_data.inventory_year = 2012 
WHERE stores.district_id = 1 

しかし、私はデータを取得できるようにする必要があります2年間の地区内の店舗のため、データはこれに近いものをそのように見えること:

store_id | yr2011 | yr2012 

答えて

0

、あなたは次のクエリ試みることがあります。また

SELECT `s`.`store_id`, `i`.`shortage_dollars` AS `yr2011`, `i1`.`shortage_dollars` AS `yr2012` 
FROM `stores` `s` 
LEFT JOIN `inventory_data` `i` ON `s`.`store_id` = `i`.`store_id` 
    AND `i`.`inventory_year` = 2011 
LEFT JOIN `inventory_data` `i1` ON `s`.`store_id` = `i1`.`store_id` 
    AND `i1`.`inventory_year` = 2012 
WHERE `s`.`district_id` = 1 

を、あなたにも、次の単純なクエリをしようとします。

SELECT `s`.`store_id`, `i`.`inventory_year`, `i`.`shortage_dollars` 
FROM `stores` `s` 
LEFT JOIN `inventory_data` `i` ON `s`.`store_id` = `i`.`store_id` 
WHERE `s`.`district_id` = 1 
AND `i`.`inventory_year` IN (2011, 2012) 
ORDER BY `s`.`store_id`, `i`.`inventory_year` 

希望すると助かります!

+0

ありがとう!最初のバージョンは完全に完璧です。正確に私が必要としていたもの。よくやった。 – user1091949

0
SELECT 
    stores.store_id, 
    inventory_data.inventory_year 
    inventory_data.shortage_dollars 
FROM 
    (SELECT * FROM stores district_id = 1) stores 
    LEFT JOIN 
    (SELECT * FROM inventory_data 
    WHERE inventory_year IN (2011,2012)) inventory_data 
    USING (store_id) 
; 

または

あなたが必要とする特定の結果フォーマットについては0
SELECT 
    stores.store_id, 
    GROUP_CONCAT(inventory_data.shortage_dollars) dollars_per_year 
FROM 
    (SELECT * FROM stores district_id = 1) stores 
    LEFT JOIN 
    (SELECT * FROM inventory_data 
    WHERE inventory_year IN (2011,2012)) inventory_data 
    USING (store_id) 
GROUP BY stores.id,inventory_year; 
+0

ありがとうございます。私はこれらの両方のクエリを数分間実行していて、両方とも構文エラーを返すだけです。最初のselectステートメントにはカンマがないように見え、2番目のクエリにはサブクエリに "WHERE"がないようです。私は両方を修正しましたが、まだエラーが発生しています。 – user1091949

関連する問題