MySQL查询 - 从两个不同年份检索数据

时间:2012-01-06 23:05:28

标签: mysql

我似乎无法正确获取此MySQL查询。我的表包含零售店的年度库存数据。这是表格架构:

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;

我希望能够为给定区域内的所有商店检索两年的短缺金额。每个商店的库存数据仅在库存完成时添加到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

但是,我需要能够为一个区内的商店获取数据两年,这样数据看起来就像这样:

store_id | yr2011 | yr2012

2 个答案:

答案 0 :(得分: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)
;

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;

答案 1 :(得分: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`

希望它有所帮助!