繁体   English   中英

带有两个表的mysql / pivot表

[英]mysql/pivot table with two tables

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

表格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而不是名称,因为否则您将需要寻找重复的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM