2016-05-30 5 views
0

私は複数の行を異なる行で1つの行に結合しようとしましたが、異なる方法を与えました。私のデータはあります。2つのテーブルを持つmysql/pivotテーブル

表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 

体を整理してください。

答えて

1

これを高度な知識なしに1つのステートメントで解決しようとしないでください。 スクリプトを作成し、いくつかの手順に分割します。あなたがそれを正しく実行すれば、本当にすばやく実行されます(通常、単一クエリアプローチよりも速い)。

手順とすることができる:

名前とDUE_DATEにより表1及び注文データで強化表2表3を作成します。あなたは第一、第二などの発生との関連を参照することができます。その後

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


一意キーのAUTO_INCREMENTと一部が名と共にある列を追加することによって、名前ごとの出現と数の列を追加します。使用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を使用する方が良いでしょう。

関連する問題