2013-10-28 2 views
1

:MySQL의 : 여러 테이블 합 케이스 난 다음 표했다

표 :

CREATE TABLE table1 
    (
    id int auto_increment primary key, 
    person varchar(30), 
    color_code varchar(30), 
    item_id varchar(30), 
    date_start DATE, 
    date_complete DATE 
    ); 

INSERT INTO table1 
(person, color_code, item_id, date_start, date_complete) 
VALUES 
('Jackson', 'RED', '1', '2013-07-11 11:23:39', '2013-08-1 11:23:39'), 
('Danny', 'BLUE', '2', '2013-07-20 11:23:39', '2013-08-1 11:23:39'), 
('Jimmy', 'GREEN', '5', '2013-05-15 11:23:39', '2013-08-1 11:23:39'), 
('Jackson', 'RED', '3', '2013-02-16 11:23:39', '2013-08-1 11:23:39'), 
('Jimmy', 'BLUE', '4', '2013-03-13 11:23:39', '2013-08-1 11:23:39'), 
('William', 'RED', '5', '2013-04-29 11:23:39', '2013-08-1 11:23:39'), 
('William', 'BLUE', '1', '2013-05-9 11:23:39', '2013-08-1 11:23:39'), 
('Danny', 'GREEN', '5', '2013-01-6 11:23:39', '2013-08-1 11:23:39'), 
('Jackson', 'RED', '4', '2013-07-11 11:23:39', '2013-08-1 11:23:39'), 
('Jackson', 'RED', '5', '2013-08-7 11:23:39', '2013-09-1 11:23:39'); 

표 2 :

CREATE TABLE table2 
    (
    id int auto_increment primary key, 
    item_code varchar(30), 
    item_name varchar(30) 
    ); 

INSERT INTO table2 
(item_code, item_name) 
VALUES 
('1', 'APPLE'), 
('2', 'BANANA'), 
('3', 'PINEAPPLE'), 
('4', 'WATERMELON'), 
('5', 'GUAVA'); 

이처럼 내 SQL 쿼리의 모양을

SELECT 

    person AS 'Name', 
    COUNT(*) AS 'Total Item Purchased', 
    SUM(CASE WHEN (color_code='RED') THEN 1 ELSE 0 END) AS 'Total Red Color', 
    SUM(CASE WHEN (color_code='BLUE') THEN 1 ELSE 0 END) AS 'Total Blue Color', 
    SUM(CASE WHEN (color_code='GREEN') THEN 1 ELSE 0 END) AS 'Total Green Color', 
    SUM(CASE WHEN DATEDIFF(date_complete, date_start) BETWEEN 1 AND 30 THEN 1 ELSE 0 END) AS 'Bought Between 1-30 Days' 

FROM table1 

    WHERE 
    person LIKE '%Jackson%' OR 
    person LIKE '%Danny%' OR 
    person LIKE '%Jimmy%' OR 
    person LIKE '%William%' 
    GROUP BY person; 

문제 :항목 이름을 표시하려면 사람으로 모든 행 그룹과 함께 선택 쿼리에 테이블 2을 표시 하시겠습니까? 내 subselect에 대한 생각, '1-30 일 사이에 샀다' 가능합니까?

Sample output that i want

SQLFiddle : http://sqlfiddle.com/#!2/d59e0/4

답변

3

당신은 테이블을 조인하고 GROUP_CONCAT()를 사용할 수 있습니다

SELECT 

    person AS 'Name', 
    COUNT(*) AS 'Total Item Purchased', 
    SUM(CASE WHEN (color_code='RED') THEN 1 ELSE 0 END) AS 'Total Red Color', 
    SUM(CASE WHEN (color_code='BLUE') THEN 1 ELSE 0 END) AS 'Total Blue Color', 
    SUM(CASE WHEN (color_code='GREEN') THEN 1 ELSE 0 END) AS 'Total Green Color', 
    SUM(CASE WHEN DATEDIFF(date_complete, date_start) BETWEEN 1 AND 30 THEN 1 ELSE 0 END) AS 'Bought Between 1-30 Days', 
    GROUP_CONCAT(item_name) 

FROM table1 JOIN table2 ON table2.item_code = table1.item_id 

    WHERE 
    person LIKE '%Jackson%' OR 
    person LIKE '%Danny%' OR 
    person LIKE '%Jimmy%' OR 
    person LIKE '%William%' 
    GROUP BY person; 

sqlfiddle에를 참조하십시오.

테이블을 조인하고 결과 집합을 person으로 정렬하여 응용 프로그램의 프레젠테이션 계층에서 이러한 집계를 수행하는 것이 더 나을 때가 있습니다.

+0

작품의 매력처럼, 어떻게 GROUP_CONCAT 작업이 가입 할 수 있습니까? – Teddybugs

+0

@David : MySQL 문서에 대한 링크 다음에 "*이 함수는 그룹에서 NULL이 아닌 값이 연결된 문자열 결과를 반환합니다. *" – eggyal

+0

은 다중 필드를 표시하기 위해 GROUP_CONCAT()를 조작 할 수 있습니다. 예 : item_name 및 item_manufacture가있는 경우 다음과 같이 표시하려고합니다. APPLE - 오스트레일리아 바나나 - 미국 쉼표 대신 줄 바꿈으로 구분합니다. 그것은 가능한가? – Teddybugs

1

당신은

SELECT 

    person AS 'Name', 
    COUNT(*) AS 'Total Item Purchased', 
    SUM(CASE WHEN (color_code='RED') THEN 1 ELSE 0 END) AS 'Total Red Color', 
    SUM(CASE WHEN (color_code='BLUE') THEN 1 ELSE 0 END) AS 'Total Blue Color', 
    SUM(CASE WHEN (color_code='GREEN') THEN 1 ELSE 0 END) AS 'Total Green Color', 
    SUM(CASE WHEN DATEDIFF(date_complete, date_start) BETWEEN 1 AND 30 THEN 1 ELSE 0 END) 'Bought Between 1-30 Days', 
    item_name as 'item' 

FROM table1,table2 

    WHERE 
    table1.item_id = table2.item_code and (
    person LIKE '%Jackson%' OR 
    person LIKE '%Danny%' OR 
    person LIKE '%Jimmy%' OR 
    person LIKE '%William%') 
    GROUP BY person; 

확인 테이블 JS http://sqlfiddle.com/#!2/d59e0/13