2012-05-07 68 views
3

我想根據星期將多行轉換爲單行。它應該如下所示。誰能幫我?MySQL:如何將多行轉換爲單行?在mysql

id  | Weight | Created | 
1  | 120  | 02-04-2012 | 
2  | 110  | 09-04-2012 | 
1  | 100  | 16-04-2012 | 
1  | 130  | 23-04-2012 | 
2  | 140  | 30-04-2012 | 
3  | 150  | 07-05-2012 | 

結果應該是這樣的:

id  | Weight_week1 | Weight_week2 | weight_week3 | weight_week4 | 
1  |  120   |  100  |  130  |    | 
2  |  110   |  140  |    |    | 
3  |  150   |    |    |    | 

在此先感謝。

+2

如何定義「第1周」,「第2周」等? – Raptor

+0

一個查詢無法完成您的願望。你必須爲你的任務使用多個查詢。 – Raptor

+0

可能重複[MYSQL - 行到列](http://stackoverflow.com/questions/1241178/mysql-rows-to-columns) – Ben

回答

0

你不能像這樣創建字段,但你可以將它們分組。

使用GROUP_CONCAT可以用分隔符傳遞結果,您可以稍後再分開。

+0

也許OP想要一些其他形式的聚合?和? AVG?問題不明確。 – eggyal

1

你可以做這樣的:

SELECT 
    t.id, 
    SUM(CASE WHEN WeekNbr=1 THEN Table1.Weight ELSE 0 END) AS Weight_week1, 
    SUM(CASE WHEN WeekNbr=2 THEN Table1.Weight ELSE 0 END) AS Weight_week2, 
    SUM(CASE WHEN WeekNbr=3 THEN Table1.Weight ELSE 0 END) AS Weight_week3, 
    SUM(CASE WHEN WeekNbr=4 THEN Table1.Weight ELSE 0 END) AS Weight_week4 
FROM 
    (
    SELECT 
     (
      WEEK(Created, 5) - 
      WEEK(DATE_SUB(Created, INTERVAL DAYOFMONTH(Created) - 1 DAY), 5) + 1 
     )as WeekNbr, 
     Table1.id, 
     Table1.Weight, 
     Table1.Created 
    FROM 
     Table1 
    ) AS t 
GROUP BY 
    t.id 

我不知道如果你想要一個AVGSUMMAXMIN但你可以改變總給你想要的東西。

有用的參考資料:

1

,如果這一個表,然後

SELECT GROUP_CONCAT(weight) as Weight, 
     WEEK(Created) as Week 
Group by Week(Created) 

這會給你一個排各有星期ID和逗號分隔whights

0

您也可以這樣做:

SELECT id, created, weight, (
    SELECT MIN(created) FROM weights WHERE w.id = weights.id 
) AS `min` , round(DATEDIFF(created, (
    SELECT MIN(created) 
FROM weights 
WHERE w.id = weights.id)) /7) AS diff 
FROM weights AS w 
ORDER BY id, diff 

此代碼不支持數據透視表。您應該添加一些額外的代碼來將數據轉換爲您的需要。如果由於多年使用WEEK(),您可能會遇到麻煩。