2014-01-27 16 views
0

인상 테이블에서 뷰를 요약하려고하지만 일부 캠페인에 대해 두 개 이상의 항공편이 있기 때문에 일부의 답변이 두 배가됩니다.MYSQL Double Counting Sum

3 개의 다른 테이블의 데이터를 결합합니다. 비행 표의 한 행만 반환되도록 할 수 있습니까?

SELECT CAMPAIGN_CPM, CAMPAIGN.CAMPAIGN_ID, CAMPAIGN_NAME, MONTHNAME(IMP_DATE), SUM(VIEWS), CONCAT(MONTH(IMP_DATE),'-',YEAR(IMP_DATE)) AS MonthYear 
FROM IMPRESSION 
INNER JOIN CAMPAIGN 
ON IMPRESSION.CAMPAIGN_ID = CAMPAIGN.CAMPAIGN_ID 
INNER JOIN FLIGHT 
ON FLIGHT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGN_ID 
WHERE MONTH(IMP_DATE) = MONTH(now() - interval 1 MONTH) AND CAMPAIGN_CPM > 0 
GROUP BY MONTHNAME(IMP_DATE), IMPRESSION.CAMPAIGN_ID, CAMPAIGN_CPM; 

다른 정보가 필요하면 알려주십시오.

테이블 사전에

CREATE TABLE `FLIGHT` (
    `FLIGHT_ID` int(11) NOT NULL, 
    `FLIGHT_NAME` varchar(255) DEFAULT NULL, 
    `FLIGHT_START_DATE` date DEFAULT NULL, 
    `FLIGHT_END_DATE` date DEFAULT NULL, 
    `CAMPAIGN_FREQUENCY` int(11) DEFAULT NULL, 
    `CAMPAIGN_FREQUENCY_PERIOD` varchar(255) DEFAULT NULL, 
    `CAMPAIGN_CPM` double DEFAULT NULL, 
    `CAMPAIGN_STATUS` varchar(255) DEFAULT NULL, 
    `CUSTOM_CAMPAIGN_TYPE` varchar(255) DEFAULT NULL, 
    `CAMPAIGN_ID` int(11) NOT NULL, 
    PRIMARY KEY (`FLIGHT_ID`), 
    KEY `CAMPAIGN` (`CAMPAIGN_ID`), 
    CONSTRAINT `CAMPAIGN_FK4` FOREIGN KEY (`CAMPAIGN_ID`) REFERENCES `CAMPAIGN` (`CAMPAIGN_ID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `IMPRESSION` (
    `IMP_DATE` date NOT NULL, 
    `CAMPAIGN_ID` int(11) NOT NULL, 
    `BANNER_ID` int(11) DEFAULT NULL, 
    `CUSTOMER_ID` int(11) DEFAULT NULL, 
    `ADVERTISER_ID` int(11) DEFAULT NULL, 
    `PLACEMENT_ID` int(11) DEFAULT NULL, 
    `IMPRESSIONS_WITH_DEFAULTS` int(11) DEFAULT NULL, 
    `IMPRESSIONS_WITHOUT_DEFAULTS` int(11) DEFAULT NULL, 
    `VIEWS` int(11) DEFAULT NULL, 
    `DEFAULTS` int(11) DEFAULT NULL, 
    `CLICKS` int(11) DEFAULT NULL, 
    `IMPRESSION_ID` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`IMPRESSION_ID`), 
    KEY `CAMPAIGN_ID` (`CAMPAIGN_ID`), 
    KEY `BANNER_ID` (`BANNER_ID`), 
    KEY `CUSTOMER_ID` (`CUSTOMER_ID`), 
    KEY `ADVERTISER_ID` (`ADVERTISER_ID`), 
    KEY `PLACEMENT_ID` (`PLACEMENT_ID`), 
    KEY `CAMPAIGN_ID_2` (`CAMPAIGN_ID`), 
    CONSTRAINT `DSF` FOREIGN KEY (`PLACEMENT_ID`) REFERENCES `PLACEMENT` (`PLACEMENT_ID`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `ADVERTISER_FK9` FOREIGN KEY (`ADVERTISER_ID`) REFERENCES `ADVERTISER` (`ADVERTISER_ID`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `BANNER_FK5` FOREIGN KEY (`BANNER_ID`) REFERENCES `BANNER` (`BANNER_ID`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `CAMPAIGN_FK3` FOREIGN KEY (`CAMPAIGN_ID`) REFERENCES `CAMPAIGN` (`CAMPAIGN_ID`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `CUSTOMER_FK5` FOREIGN KEY (`CUSTOMER_ID`) REFERENCES `CUSTOMER` (`CUSTOMER_ID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=35673 DEFAULT CHARSET=utf8 


CREATE TABLE `CAMPAIGN` (
    `CAMPAIGN_ID` int(11) NOT NULL, 
    `CAMPAIGN_NAME` varchar(255) DEFAULT NULL, 
    `CAMPAIGN_START_DATE` date DEFAULT NULL, 
    `CAMPAIGN_END_DATE` date DEFAULT NULL, 
    `ADVERTISER_ID` int(11) NOT NULL, 
    PRIMARY KEY (`CAMPAIGN_ID`), 
    KEY `ADVERTISER` (`ADVERTISER_ID`), 
    CONSTRAINT `ADVERTISER_FK2` FOREIGN KEY (`ADVERTISER_ID`) REFERENCES `ADVERTISER` (`ADVERTISER_ID`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

감사합니다.

+1

테이블 구조가 좋을 것입니다. 테이블 구조와 샘플 데이터가 더 좋음. Sqlfiddle 만들기 (www.sqlfiddle.com) –

+0

인상 테이블은보기와 캠페인 ID를 포함합니다. 광고 게재 기간 테이블에 캠페인 ID가 포함되어 있습니다. 캠페인 표에는 캠페인 이름과 캠페인 ID가 포함되어 있습니다. 그게 도움이 되니? – cartoom02

+0

"show create table"명령을 사용하여 테이블 구조를 다시 만들고 질문에 게시하십시오. –

답변

0

이 시도 :

내가 추가 한 비행 한 항공편 번호가 표시 내가보기에서 위치를 변경 것을 보여주기 위해.

SQL 코드는 : 나는 샘플 데이터로 테이블을 채우기 위해했기 때문에

SELECT * FROM (
SELECT FLIGHT.FLIGHT_ID, SUM(VIEWS), CAMPAIGN_CPM, CAMPAIGN.CAMPAIGN_ID, CAMPAIGN_NAME, MONTHNAME(IMP_DATE), CONCAT(MONTH(IMP_DATE),'-',YEAR(IMP_DATE)) AS MonthYear 
FROM IMPRESSION 
INNER JOIN CAMPAIGN 
ON IMPRESSION.CAMPAIGN_ID = CAMPAIGN.CAMPAIGN_ID 
INNER JOIN FLIGHT 
ON FLIGHT.CAMPAIGN_ID = CAMPAIGN.CAMPAIGN_ID 
WHERE MONTH(IMP_DATE) = MONTH(now() - interval 1 MONTH) AND CAMPAIGN_CPM > 0 
GROUP BY MONTHNAME(IMP_DATE), IMPRESSION.CAMPAIGN_ID, CAMPAIGN_CPM 
) a GROUP BY a.CAMPAIGN_ID; 

나는 몇 가지 작은 변화를 만들었습니다. 또한 기본 키와 계단식 연결에 몇 가지 문제가있었습니다. 그러나 Every는 귀하의 버전에서 작동해야합니다.

TABLE 구조 :

CREATE TABLE `FLIGHT` (
    `FLIGHT_ID` int(11) NOT NULL PRIMARY KEY, 
    `FLIGHT_NAME` varchar(255) DEFAULT NULL, 
    `FLIGHT_START_DATE` date DEFAULT NULL, 
    `FLIGHT_END_DATE` date DEFAULT NULL, 
    `CAMPAIGN_FREQUENCY` int(11) DEFAULT NULL, 
    `CAMPAIGN_FREQUENCY_PERIOD` varchar(255) DEFAULT NULL, 
    `CAMPAIGN_CPM` double DEFAULT NULL, 
    `CAMPAIGN_STATUS` varchar(255) DEFAULT NULL, 
    `CUSTOM_CAMPAIGN_TYPE` varchar(255) DEFAULT NULL, 
    `CAMPAIGN_ID` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `IMPRESSION` (
    `IMP_DATE` date NOT NULL, 
    `CAMPAIGN_ID` int(11) NOT NULL, 
    `BANNER_ID` int(11) DEFAULT NULL, 
    `CUSTOMER_ID` int(11) DEFAULT NULL, 
    `ADVERTISER_ID` int(11) DEFAULT NULL, 
    `PLACEMENT_ID` int(11) DEFAULT NULL, 
    `IMPRESSIONS_WITH_DEFAULTS` int(11) DEFAULT NULL, 
    `IMPRESSIONS_WITHOUT_DEFAULTS` int(11) DEFAULT NULL, 
    `VIEWS` int(11) DEFAULT NULL, 
    `DEFAULTS` int(11) DEFAULT NULL, 
    `CLICKS` int(11) DEFAULT NULL, 
    `IMPRESSION_ID` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY 
) ENGINE=InnoDB AUTO_INCREMENT=35673 DEFAULT CHARSET=utf8; 

CREATE TABLE `CAMPAIGN` (
    `CAMPAIGN_ID` int(11) NOT NULL PRIMARY KEY, 
    `CAMPAIGN_NAME` varchar(255) DEFAULT NULL, 
    `CAMPAIGN_START_DATE` date DEFAULT NULL, 
    `CAMPAIGN_END_DATE` date DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

샘플 데이터 : 여기

INSERT INTO FLIGHT (FLIGHT_ID, CAMPAIGN_ID,CAMPAIGN_CPM) 
VALUES (255060,1,250), 
(255080,1,250), 
(255070,1,250), 
(255020,1,40), 
(255025,2,300), 
(255040,3,250), 
(255045,3,20), 
(255046,3,100), 
(255071,4,210), 
(255055,5,280); 

INSERT INTO IMPRESSION (IMP_DATE,CAMPAIGN_ID, VIEWS) 
VALUES 
((NOW() - INTERVAL 10 DAY),1,250), 
((NOW() - INTERVAL 1 MONTH),2,4050), 
((NOW() - INTERVAL 1 MONTH),3,10), 
((NOW() - INTERVAL 3 DAY),3,40), 
((NOW() - INTERVAL 1 MONTH),3,10), 
((NOW() - INTERVAL 3 DAY),4,40), 
((NOW() - INTERVAL 1 MONTH),5,1350); 

INSERT INTO CAMPAIGN (CAMPAIGN_ID, CAMPAIGN_NAME) 
VALUES 
(1,'jkajoiuwejoijdkjjklja'), 
(2,'ajiuiouwoihajdhjhhjh'), 
(3, 'aauuehxbhchuhnb'), 
(4,'aduuiuhzjcnckjnxkj'), 
(5,'zzzdfhjfhajkhwkjeajqw'); 

SQLFIDDLE 데모이다. 그것을 밖으로 시도하십시오. 행운을 빈다.

+0

@ cartoom02 내 대답을 보셨나요? –