2017-03-24 1 views
0

내가 그런 가입 쿼리에서 모든 EDC 값을 검색 할 수있는 방법이내가 너무

SET @curr_date = '2017-03-23'; 

SELECT 
curr_week.mid AS MID, 
curr_week.EDC AS Merchant_Name , 
COALESCE(curr_week.amount,0) AS Total_Amount_Curr_Week, 
COALESCE(curr_week.total_trx,0) AS Total_Trx_Curr_Week, 
COALESCE(curr_week.total_user,0) AS Total_User_Curr_Week, 

COALESCE(last_week.amount,0) AS Total_Amount_Last_Week, 

COALESCE(last_week.total_trx,0) AS Total_Trx_Last_Week, 

COALESCE(last_week.total_user,0) AS Total_User_Last_Week 
FROM 
(
    SELECT a.*, b.total_user 
    FROM 
    (
     SELECT a1.owner_name AS MID, m.name AS EDC,SUM(t1.amount) AS amount, COUNT(t1.id) AS total_trx 
     FROM members m 
     JOIN accounts a1 ON a1.member_id = m.id 
     JOIN transfers t1 ON a1.id = t1.to_account_id 
     WHERE DATE(t1.DATE) = (@curr_date - INTERVAL 1 DAY) 
     GROUP BY a1.owner_name 
    ) AS a 

    JOIN 

    (-- get total user 
     SELECT COUNT(r.ecash_no) AS total_user, r.mid, r.merchant_name 
     FROM 
      (
       SELECT a.`owner_name` AS ecash_no, 
       a1.owner_name AS MID, 
       m.name AS merchant_name 
       FROM accounts a1 
       JOIN transfers t1 ON a1.id = t1.to_account_id 
       JOIN members m ON a1.member_id = m.id 
       JOIN accounts a ON a.id = t1.from_account_id 
       WHERE DATE(t1.date) = (@curr_date - INTERVAL 1 DAY) 
       GROUP BY a.owner_name,m.`name` 
      ) AS r 
     GROUP BY r.mid 
    ) AS b ON a.mid = b.mid 
) AS curr_week 

JOIN 

(
-- last week 
    SELECT a.*, b.total_user 
    FROM 
    (
     SELECT a1.owner_name AS MID, m.name AS EDC,SUM(t1.amount) AS amount, COUNT(t1.id) AS total_trx 
     FROM members m 
     JOIN accounts a1 ON a1.member_id = m.id 
     JOIN transfers t1 ON a1.id = t1.to_account_id 
     WHERE DATE(t1.DATE) = (@curr_date - INTERVAL 1 DAY) - INTERVAL 1 WEEK 
     GROUP BY a1.owner_name 
    ) AS a 

    JOIN 

    (-- get total user 
     SELECT COUNT(r.ecash_no) AS total_user, r.mid, r.merchant_name 
     FROM (
      SELECT a.`owner_name` AS ecash_no, 
      a1.owner_name AS MID, 
      m.name AS merchant_name 
      FROM accounts a1 
      JOIN transfers t1 ON a1.id = t1.to_account_id 
      JOIN members m ON a1.member_id = m.id 
      JOIN accounts a ON a.id = t1.from_account_id 
      WHERE DATE(t1.date) = (@curr_date - INTERVAL 1 DAY) - INTERVAL 1 WEEK 
      GROUP BY a.owner_name,m.`name` 
     ) AS r 
     GROUP BY r.mid 
    ) AS b ON a.mid = b.mid 
) AS last_week ON curr_week.mid = last_week.mid 

같은 질문이 왼쪽 쿼리에없는 2 개 이상의 쿼리에서 모든 레코드를 표시합니다. 내가 조인을 사용하면 동일한 값만 표시되기 때문입니다. 왼쪽 결합을 사용하면 왼쪽 쿼리의 값을 따릅니다. 모든 것을 표시 할 수있는 방법이 있습니까? 당신은 완전 외부를 시뮬레이션 할 수 있습니다

답변

1

는 다음을 사용하여 두 테이블의 조인

SELECT COALESCE(a.ColA, b.ColA) AS ColA, 
     COALESCE(a.ColB, b.ColB) AS ColB 
FROM tableA a 
LEFT JOIN tableB b ON a.ColA = b.ColA 
UNION 
SELECT COALESCE(a.ColA, b.ColA) AS ColA, 
     COALESCE(a.ColB, b.ColB) AS ColB 
FROM tableA a 
RIGHT JOIN tableB b ON a.ColA = b.ColA; 

참고 : 난 단지 ColA이 (가) 열을 조인 것으로 가정했습니다. 조인 열로도 ColB을 추가하거나 조인 열로 ColB 만 사용할 수 있습니다. 이것은 실제로 테이블의 디자인에 달려 있지만, 제가 제시 한 일반적인 접근 방식은 여전히 ​​효과가 있습니다.

출력 : 여기

enter image description here

데모 :

Rextester

+0

무엇을 거기에 내가 가입해야 3 개 이상의 테이블을하고 나는 그에서 모든 기록을 필요로하는 경우 테이블? 이걸 적용 할 수 있을까요? – rinaldy31

+0

이렇게하면 원래 질문이 완전히 변경됩니다. 나는이 테이블을 볼 필요가 있지만 실제로 4 개의 테이블로 작업해야하는 경우 실제 문제를 반영하는 새로운 질문을 열어야합니다. –

+0

오케이 미안 해요 편집 할게요. – rinaldy31

관련 문제