在MySQL中作为列的行

时间:2014-02-01 07:34:38

标签: mysql sql

我有mysql db,其中我有一些公司的数据(行方式)。我需要一份报告,该报告应该是公司日常交易,公司名称应显示为列,并且相同表格中的金额应显示为行。

报告正在生成,但值为null。

表格结构:

------------------------------------------
company_id |   date    | amount | party_id
------------------------------------------
1000       | 1-1-14    | 10000  | 101
1001       | 2-1-14    | 20900  | 102
1001       | 2-1-14    | 20000  | 102
1000       | 1-1-14    | 10000  | 101
1000       | 2-1-14    | 21000  | 101
------------------------------------------

我想要这种格式的报道:

---------------------
1000  |  1001 | 1002 
---------------------
10000 | 20900 | NULL
10000 | 20000 | NULL
21000 | NULL  | NULL
---------------------

应返回3行。

我正在使用下面提到的查询:

SELECT 
       (CASE WHEN company_id = '1000' THEN transaction_amount  END) `1000`,
       (CASE WHEN company_id = '1001' THEN transaction_amount END) `1001`,
       (CASE WHEN company_id = '1003' THEN transaction_amount END) `1002`,
FROM table3;

但是我得到的行数很多。

---------------------
1000  |  1001 | 1002 
---------------------
10000 | NULL  | NULL
NULL  | 20900 | NULL
NULL  | 20000 | NULL
10000 | NULL  | NULL
21000 | NULL  | NULL
---------------------

查询返回5行。

我尝试order bygroup by但没有成功。 请帮帮我。

1 个答案:

答案 0 :(得分:1)

在您的原始查询中,您没有使用GROUP BY,这就是为什么您在结果集中获得的行数与表中的数量相同。

现在GROUP BY的问题是由于您没有用于对行进行分组的列。因此,为了产生期望的结果,您可以引入这个非exitent列 - 按日期排序的每个company_id的行号

SELECT MAX(CASE WHEN company_id = 1000 THEN amount END) `1000`,
       MAX(CASE WHEN company_id = 1001 THEN amount END) `1001`,
       MAX(CASE WHEN company_id = 1002 THEN amount END) `1002`
  FROM
(
  SELECT t.*,
         @n := IF(@c = company_id, @n + 1, 1) rnum, @c := company_id
    FROM table1 t CROSS JOIN (SELECT @n := 0, @c := NULL) i
   ORDER BY company_id, date
) q
 GROUP BY rnum

输出:

|  1000 |   1001 |   1002 |
|-------|--------|--------|
| 10000 |  20900 | (null) |
| 10000 |  20000 | (null) |
| 21000 | (null) | (null) |

这是 SQLFiddle 演示