你能帮我解决一下我的问题吗?我正在使用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编程以期望的方式准备结果?
感谢您的帮助,
由于
答案 0 :(得分:0)
您可以创建商店程序,可以在下面链接对它有帮助
答案 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 |
|------------|--------------|-------------|--------|---------|---------|
*/
?>
我认为这对我有用。谢谢!