MySql Query返回按行日期分组的相同列的不同别名

时间:2012-03-09 01:57:37

标签: mysql sql charts pivot

我正在尝试做一些报表折线图,如果我从查询中返回一个数据行,我会发现它最简单,这些数据行将出现在折线图中。挑战在于我需要不止一条线。

以下是我可以使用简化的数据示例:

    |  DATE      | SALES | LOCATION |
    | 2012-01-07 | 500   | 1        |
    | 2012-01-07 | 600   | 2        |
    | 2012-01-14 | 700   | 1        |
    | 2012-01-14 | 400   | 2        |
    | 2012-01-21 | 450   | 1        |
    | 2012-01-21 | 550   | 2        |

选择日期,总和(销售额)作为SalesTotal1 FROM TABLE WHERE location ='1'按日期分组

返回:

    |     DATE   | SalesTotal1 |
    | 2012-01-07 |     500     |
    | 2012-01-14 |     700     |
    | 2012-01-21 |     450     |

如果我的图表中只有一行,但我真正想要的是同一列的多个别名仍然按日期分组,这样就可以了:

    |     DATE   | SalesTotal1 | SalesTotal2 |
    | 2012-01-07 |     500     |     600     |
    | 2012-01-14 |     700     |     400     |
    | 2012-01-21 |     450     |     550     |

这可能吗?子查询?我尝试了很多东西,谢谢〜

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

SELECT `date`, 
       SUM(IF(location=1,sales,0)) As SalesTotal1,
       SUM(IF(location=2,sales,0)) As SalesTotal2
FROM my_table
GROUP BY `date`

你必须添加尽可能多的列,如果你有很多位置,那就太烦人了。也许你可以考虑在代码方面重新安排(如果你有很多很多地方)?

答案 1 :(得分:0)

这称为PIVOT表查询,MYSQL通常不支持该查询。但是,如果您确切知道位置,则可以使用一系列子查询来完成。如果您不知道确切的位置,则必须编写一个存储过程来查找位置并构建查询字符串然后执行。以下是如何做两个位置:

SELECT
    date,
    SalesTotal1,
    SalesTotal2
FROM (
    SELECT
        date,
        sum(sales) as SalesTotal1
    FROM TABLE
    WHERE location = '1'
    group by date
) S1
INNER JOIN (
    SELECT
        date,
        sum(sales) as SalesTotal2
    FROM TABLE
    WHERE location = '2'
    group by date
) S2 ON S1.date=S2.date