【问题标题】:xampp mysql - pivot result from one single tablexampp mysql - 来自一个表的透视结果
【发布时间】:2014-03-27 13:10:17
【问题描述】:

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

我有一个如下所示的表格:

|----|------------|--------------|-------------|------------|----------|
| 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 编程来以所需的方式准备结果?

感谢您的帮助,

谢谢

【问题讨论】:

    标签: mysql sql xampp pivot


    【解决方案1】:

    您可以创建存储过程,可能在下面的链接会有所帮助

    How to select column names dynamically in mySQL

    【讨论】:

      【解决方案2】:

      我想我只是回答了我自己的问题。 :) 我需要根据货币字段中的所有值动态创建 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 |
      |------------|--------------|-------------|--------|---------|---------|
      */
      ?>
      

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

      【讨论】:

        猜你喜欢
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多