2017-04-14 3 views
0

를 사용하여 총 합계 I가 다음과 같은 SQL목록 모든 데이터 중복 행을 병합와 MySQL

SELECT 
    i.si_num AS `id`, 
    DATE_FORMAT(i.si_date, '%d-%b-%Y') AS `date`, 
    i.si_tr AS `tr`, 
    d.dl_name AS `customer`, 
    i.si_net_value AS `net`, 
    DATEDIFF(CURDATE(), si_date) AS Days, 
    t.value AS tval, 
    t.label AS label 
FROM 
    invoices AS i 
LEFT JOIN 
    dealer AS d ON i.si_tr = d.dl_id 
LEFT JOIN 
    transactions AS t ON i.si_num = t.invoice 
WHERE 
    i.si_tr = 'TR580494' 
ORDER BY `si_num` DESC; 

전류 출력

+-----+-----------+----------+---------------------+---------+------+-------+-------+ 
| id | date | tr |  customer  | net | Days | tval | label | 
+-----+-----------+----------+---------------------+---------+------+-------+-------+ 
| 404 | 18-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 109790 | 55 | 96070 | acr | 
| 404 | 18-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 109790 | 55 | 10080 | crn | 
| 404 | 18-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 109790 | 55 | 3640 | crn | 
| 240 | 13-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 0  | 60 | NULL | NULL | 
| 239 | 13-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 81975 | 60 | 30405 | acr | 
| 239 | 13-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 81975 | 60 | 51570 | crn | 
| 132 | 3-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 38132.5 | 70 | 33282 | acr | 
+-----+-----------+----------+---------------------+---------+------+-------+-------+ 

당신이있는 일부 중복 행이 볼 수 id와 같이 생성됨 : 404 이러한 행의 유일한 차이점은 열 'tval'& 'label'

의 값입니다.3210

'tval'및 'label'열은 ID 당 두 번 이상 채울 수 있습니다. 달성하려는 대상은 'crn'또는 'arc'및 sum인지 확인하려는 모든 중복 레코드입니다 id에 해당하는 값을 가져와 한 행을 생성하고 레이블을 열로 조 변경합니다. 예상 출력에 대해서는 아래를 참조하십시오.

예상 출력

+-----+-----------+----------+---------------------+---------+------+-------+-------+ 
| id | date | tr |  customer  | net | days | crn | acr | 
+-----+-----------+----------+---------------------+---------+------+-------+-------+ 
| 404 | 18-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 109790 | 55 | 13720 | 96070 | 
| 240 | 13-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 0  | 60 | NULL | NULL | 
| 239 | 13-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 81975 | 60 | 51570 | 30405 | 
| 132 | 3-Feb-17 | TR580494 | STARSHIP ENTERPRISE | 38132.5 | 70 | NULL | 33282 | 
+-----+-----------+----------+---------------------+---------+------+-------+-------+ 

답변

0

당신이 할 수있는 casesum, 안쪽에 그 :

SELECT 
    i.si_num AS `id`, 
    DATE_FORMAT(i.si_date, '%d-%b-%Y') AS `date`, 
    i.si_tr AS `tr`, 
    d.dl_name AS `customer`, 
    i.si_net_value AS `net`, 
    DATEDIFF(CURDATE(), si_date) AS Days, 
    sum(case when t.label = 'acr' then t.value else null end) as acr 
    sum(case when t.label = 'crn' then t.value else null end) as crn 
FROM 
    invoices AS i 
LEFT JOIN 
    dealer AS d ON i.si_tr = d.dl_id 
LEFT JOIN 
    transactions AS t ON i.si_num = t.invoice 
WHERE 
    i.si_tr = 'TR580494' 
GROUP BY i.si_num, 
      DATE_FORMAT(i.si_date, '%d-%b-%Y'), 
      i.si_tr, 
      d.dl_name, 
      i.si_net_value, 
      DATEDIFF(CURDATE(), si_date) 
ORDER BY `si_num` DESC; 
+0

덕분에 많은 스테파노 자니 니, 마치 마법처럼 작동 ... – Prem

+0

덕분에 많은 스테파노 매력처럼 작동하지만 작은 오류가 발생했습니다. 사례 명세서가 불완전하여 수정되었습니다. SUM (사례. t.label = 'acr'THEN t.value ELSE NULL END) as acr 감사합니다. :) – Prem

+0

주목할만한 점은 추가해야 할 개선 사항으로 내 대답을 편집했습니다. –