带有两个表的mysql / pivot表

时间:2016-05-30 14:00:45

标签: mysql

我正在尝试将多行组合成不同列的单行,但它给出了不同的方式。我的数据就是这样。

表1:

aScrollView.delegate = someExample
bScrollView.delegate = someExample

表2:

| id | name | Invoice value | invoice_date |
|----|------|---------------|--------------|
| 1  | A    | 5000          | 30-01-2016   |
| 2  | B    | 8000          | 02-05-2016   |
| 3  | C    | 10000         | 03-05-2016   |

并且所需的输出应如下所示

| id | invoice_id | duedate    | amount | percentage |
|----|------------|------------|--------|------------|
| 1  | 1          | 15-01-2016 | 2500   | 50%        |
| 2  | 1          | 30-01-2016 | 2500   | 50%        |
| 3  | 2          | 15-02-2016 | 8000   | 100%       |
| 4  | 3          | 15-05-2016 | 5000   | 50%        |
| 5  | 3          | 19-05-2016 | 2500   | 25%        |
| 6  | 3          | 25-05-2016 | 2500   | 25%        |

这是我的查询,但它的给出结果用逗号分隔的duedates.i dnt wnat就是这样。

| name | invoice_value | invoice_date | due date1  | due amount1 | due date2  | due amount2 | due date3  | due amount3 |
|------|---------------|--------------|------------|-------------|------------|-------------|------------|-------------|
| A    | 5000          | 30-01-2016   | 15-01-2016 | 2500        | 30-01-2016 | 04-11-1906  | null       | null        |
| B    | 8000          | 02-05-2016   | 15-02-2016 | 8000        | null       | null        | null       | null        |
| C    | 10000         | 03-05-2016   | 15-05-2016 | 5000        | 19-05-2016 | 2500        | 19-05-2016 | 2500        |

请一些人帮我解决。

1 个答案:

答案 0 :(得分:1)

不要在没有高级知识的情况下在一个声明中尝试解决这个问题。 制作一个脚本并将其拆分为几个步骤。如果你做得对,它会很快运行(通常比单一查询方法更快)。

步骤可能是:

创建表3,表2富含表1中的数据,按名称和due_date排序 通过添加一个auto_increment列和一个Unique Key的一部分以及名称,添加一列来为每个名称的出现次数编号:

ALTER TABLE TABLE_3
ADD COLUMN position_id integer auto_increment NOT NULL,
ADD Unique Key positon_number(Name, position_id);

之后,您可以使用position_id来引用第一个,第二个等事件以及相关的duedate和dueamount:

select
name, invoice_value, invoice_date, #

if(position_id=1, duedate ,null) as due_date_1,
if(position_id=1, amount ,null) as due_amount_1,

if(position_id=2, duedate ,null) as due_date_2,
if(position_id=2, amount ,null) as due_amount_2,

if(position_id=3, duedate ,null) as due_date_3,
if(position_id=3, amount ,null) as due_amount_3,

if(position_id=4, duedate ,null) as due_date_4,
if(position_id=4, amount ,null) as due_amount_4,

if(position_id=5, duedate ,null) as due_date_5,
if(position_id=5, amount ,null) as due_amount_5

FROM table_3
GROUP BY name; 

然而,最好使用客户ID而不是名称,因为否则你必须注意重复的名称。