我目前有一个名为tempHouses
的表格,如下所示:
avgprice | dates | city
日期存储为yyyy-mm-dd
但是我需要将该表中的记录移动到名为houses
的表中,如下所示:
city | year2002 | year2003 | year2004 | year2005 | year2006
tempHouses中的信息包含1995年至2014年的平均房价。
我知道我可以使用SUBSTRING从日期中获取年份:
SUBSTRING(dates, 0, 4)
所以基本上对于tempHouses.city中的每个城市,我需要将上述年份的平均房价变为一个记录。
关于如何做到这一点的任何想法?
答案 0 :(得分:1)
这是一种SQL Server方法,PIVOT可能更好,但这是一种方式:
SELECT City,
AVG(year2002) AS year2002,
AVG(year2003) AS year2003,
AVG(year2004) AS year2004
FROM (
SELECT City,
CASE WHEN Dates BETWEEN '2002-01-01T00:00:00' AND '2002-12-31T23:59:59' THEN avgprice
ELSE 0
END AS year2002,
CASE WHEN Dates BETWEEN '2003-01-01T00:00:00' AND '2003-12-31T23:59:59' THEN avgprice
ELSE 0
END AS year2003
CASE WHEN Dates BETWEEN '2004-01-01T00:00:00' AND '2004-12-31T23:59:59' THEN avgprice
ELSE 0
END AS year2004
-- Repeat for each year
)
GROUP BY City
内部查询将数据转换为每条记录的正确格式(City, year2002, year2003, year2004
),而外部查询获取每个城市的平均值。
有许多方法可以做到这一点,而性能可能是决定选择的决定因素。
答案 1 :(得分:0)
最好的方法是使用脚本为您执行查询执行,因为您需要多次运行它并根据年份提取数据。确保唯一需要的列是city&行ID:
http://dev.mysql.com/doc/refman/5.0/en/insert-select.html
INSERT INTO <table> (city) VALUES SELECT DISTINCT `city` from <old_table>;
然后为每个城市提取平均值,将它们插入临时表中,然后插入主表。
SELECT avg(price), substring(dates, 0, 4) dates from <old_table> GROUP BY dates;
否则,您正在查看使用联接和潜在联合的组合查询来推断数据。因为你将每个城市的桌子整理成一排,所以这样做有点难度。如果您不希望数据库查询因内存限制而失败,或者只是需要很长时间才能执行,那么您应该首先在日期列上创建索引。