2014-01-27 59 views
0

我想彙總印象表格中的觀點,但有些翻譯的答案是翻倍,因爲有些廣告系列的航班超過1次。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。這有幫助嗎? – 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; 

,因爲我曾與樣本數據來填充這些表我已經取得了一些小的改動。此外,主鍵和級聯存在一些問題。但是,每個人都應該在你的版本中工作。

表結構:

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你看過我的回答嗎? –