我试图将多行合并为具有不同列的单行,但其给出的方式不同。这是我的数据。

表格1:

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


表2:

| 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%        |


所需的输出应如下所示

| 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        |


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

    SELECT
    T1.name,
    T1.invoice_value,
    T1.invoice_date,
    T1.duedate,
    T1.dueamount
FROM
    (SELECT
        table1.name,
            table1.invoice_value,
            table1.invoice_date,
            GROUP_CONCAT(table2.duedate1) AS duedate,
            GROUP_CONCAT(table2.dueamount1) AS dueamount
    FROM
        table1
    LEFT JOIN table2 ON table1.id = table2.invoice_id) T1
GROUP BY T1.id


请一些人帮我整理一下。

最佳答案

在没有高级知识的情况下,请勿尝试在一个陈述中解决此问题。
编写脚本并将其分为几个步骤。如果正确执行,它将运行得非常快(通常比单查询方法要快)。

步骤可能是:

创建表3(表2),表3中包含来自表1的数据,并按名称和due_date排序。
通过添加一个列auto_increment和唯一键的一部分以及名称来添加一个列来为每个名称的出现次数编号:

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代替名称,因为否则您将需要查找重复的名称。

关于mysql - 带有两个表的mysql/pivot表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37527590/

10-12 07:17