2016-05-30 6 views
0

Я пытался объединить несколько строк в одну строку с разными столбцами, но это дало разные способы. Есть мои данные.mysql/сводная таблица с двумя таблицами

таблица 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 | 

table2:

| 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

Не пытайтесь решить это в одном заявлении без дополнительных знаний. Сделайте сценарий и разделите его на несколько шагов. Он будет работать очень быстро, если вы сделаете это правильно (обычно быстрее, чем подход с одним запросом).

шаги могут быть:

Создать таблицу 3, которая является таблица 2, обогащенный с данными из таблицы 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); 

После этого вы можете обратиться к первым, вторым и т.д. возникновениям и связанным с ними DueDate и dueamount с помощью position_id:

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; 

Однако было бы лучше использовать идентификатор клиента вместо имени, потому что вы должны смотреть дублирующие имена иначе.

Смежные вопросы