xampp mysql - 来自一个表的pivot结果

时间:2014-03-27 13:10:17

标签: mysql sql xampp pivot

你能帮我解决一下我的问题吗?我正在使用xampp服务器和mysql数据库。

我有一个看起来像这样的表:

|----|------------|--------------|-------------|------------|----------|
| id | period     | category     | subcategory | amount     | currency |
|----|------------|--------------|-------------|------------|----------|
|  1 | 2014-01-01 | Category One | SubCat One  |     325.48 | EUR      |
|  2 | 2014-01-01 | Category One | SubCat One  |    1680.20 | GBP      |
|  3 | 2014-01-01 | Category One | SubCat Two  |     229.78 | EUR      |
|  4 | 2014-01-01 | Category One | SubCat Two  |    1152.41 | GBP      |
|  5 | 2014-01-01 | Category Two | SubCat One  |     417.92 | EUR      |
|  6 | 2014-01-01 | Category Two | SubCat One  |     980.64 | GBP      |
|----|------------|--------------|-------------|------------|----------|

我需要得到的结果是项目将按三个字段(句点,类别,子类别)和动态列分组,每个货币将添加到每个组。像这样:

|------------|--------------|-------------|--------|---------|
| period     | category     | subcategory | EUR    | GBP     |
|------------|--------------|-------------|--------|---------|
| 2014-01-01 | Category One | SubCat One  | 325.48 | 1680.20 |
| 2014-01-01 | Category One | SubCat Two  | 229.78 | 1152.41 |
| 2014-01-01 | Category Two | SubCat One  | 417.92 |  980.64 |
|------------|--------------|-------------|--------|---------|

我应该针对表运行什么SQL查询以获得所需的结果?

诀窍是查询应该自动管理多种货币,因此当我使用新货币添加新记录时,将在我的结果记录集中动态创建另一列。

使用新货币(USD)添加第7行和第8行后的表。

|----|------------|--------------|-------------|------------|----------|
| id | period     | category     | subcategory | amount     | currency |
|----|------------|--------------|-------------|------------|----------|
|  1 | 2014-01-01 | Category One | SubCat One  |     325.48 | EUR      |
|  2 | 2014-01-01 | Category One | SubCat One  |    1680.20 | GBP      |
|  3 | 2014-01-01 | Category One | SubCat Two  |     229.78 | EUR      |
|  4 | 2014-01-01 | Category One | SubCat Two  |    1152.41 | GBP      |
|  5 | 2014-01-01 | Category Two | SubCat One  |     417.92 | EUR      |
|  6 | 2014-01-01 | Category Two | SubCat One  |     980.64 | GBP      |
|----|------------|--------------|-------------|------------|----------|
|  7 | 2014-01-01 | Category One | SubCat One  |    2525.50 | USD      |
|  8 | 2014-01-02 | Category One | SubCat One  |     700.12 | USD      |
|----|------------|--------------|-------------|------------|----------|

结果(动态创建另一个货币列)。

|------------|--------------|-------------|--------|---------|---------|
| period     | category     | subcategory | EUR    | GBP     | USD     |
|------------|--------------|-------------|--------|---------|---------|
| 2014-01-01 | Category One | SubCat One  | 325.48 | 1680.20 | 2525.50 |
| 2014-01-01 | Category One | SubCat Two  | 229.78 | 1152.41 |       0 |
| 2014-01-01 | Category Two | SubCat One  | 417.92 |  980.64 |       0 |
| 2014-01-02 | Category One | SubCat One  |      0 |       0 |  700.12 |
|------------|--------------|-------------|--------|---------|---------|

有没有简单的方法可以使用sql查询实现这一点? 或者这需要一些PHP编程以期望的方式准备结果?

感谢您的帮助,

由于

2 个答案:

答案 0 :(得分:0)

您可以创建商店程序,可以在下面链接对它有帮助

How to select column names dynamically in mySQL

答案 1 :(得分:0)

我想我刚回答了自己的问题。 :) 我需要根据货币字段中的所有值动态创建SQL查询。 使用php(使用codeigniter),可以这样实现:

步骤1.我需要了解我的表格中有哪些货币

<?php
$curr_sql = "SELECT DISTINCT currency FROM `table` ORDER BY currency ASC";
$curr_query = $this->db->query($curr_sql);
/* 
|----------|
| currency |
|----------|
| EUR      |
| GBP      |
| USD      |
|----------|
*/
?>

步骤2.我需要准备sql查询(为每个现有货币添加特定列)。

<?php
$sql = "SELECT period, category, subcategory";
 foreach ($curr_query->result() as $row) {
  $curr = $row->currency;
  $sql .= ", SUM(IF(currency = '" . $curr . "', amount, 0)) AS '" . $curr . "'";
 }
$sql .= " FROM `table` GROUP BY period, category, subcategory";

/* This is the sql I will get:
SELECT period, category, subcategory
    , SUM(IF(currency = 'EUR', amount, 0)) AS 'EUR'
    , SUM(IF(currency = 'GBP', amount, 0)) AS 'GBP'
    , SUM(IF(currency = 'USD', amount, 0)) AS 'USD'
FROM `table`
GROUP BY period, category, subcategory;
*/
?>

步骤3.现在我只执行动态准备的查询。

<?php
$myResult = $this->db->query($sql);

/* This is the result I get
|------------|--------------|-------------|--------|---------|---------|
| period     | category     | subcategory | EUR    | GBP     | USD     |
|------------|--------------|-------------|--------|---------|---------|
| 2014-01-01 | Category One | SubCat One  | 325.48 | 1680.20 | 2525.50 |
| 2014-01-01 | Category One | SubCat Two  | 229.78 | 1152.41 |       0 |
| 2014-01-01 | Category Two | SubCat One  | 417.92 |  980.64 |       0 |
| 2014-01-02 | Category One | SubCat One  |      0 |       0 |  700.12 |
|------------|--------------|-------------|--------|---------|---------|
*/
?>

我认为这对我有用。谢谢!