我有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 by
,group by
但没有成功。
请帮帮我。
答案 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 演示