2016-01-26 70 views
0

我有两个计数器,一个用于单位,一个用于废物。 我需要拉取计时器的总和,并按Year分隔。
左加入有点让人联想起来,但只要我把一个where条件分开定时器,思想就会崩溃。
有人可以检查一下,给我指出正确的方向吗?
谢谢。 杰米。左侧加入不符合条件

SELECT year(counts.ts) as SalesYear, Q1.Res1 AS units, Q2.Res2 as rate 
FROM 
(counts 
LEFT JOIN (SELECT (counts.ts), SUM(counts.count) AS Res1 
FROM counts where counts.`name` = 104 and counts.count > 0) AS Q1 ON (counts.ts) = Q1.ts) 

LEFT JOIN (SELECT (counts.ts), Sum(counts.count) AS Res2 
FROM counts where counts.`name` = 107 and counts.count > 0) AS Q2 ON (counts.ts) = Q2.ts 

GROUP BY year(counts.ts) 
order by year(counts.ts) 
+0

您是否收到任何错误消息? – Sheepy

+0

在From子句中输入错误?一些错误或空的结果? – Daredzik

+0

btw:删除第一个从开始括号括起来'(计数'它不是必需或做任何有用的事情 –

回答

1

我相信你可以用“有条件的聚集”是这样的:

SELECT 
     YEAR(counts.ts) as SalesYear 
    , SUM(case when counts.count = 104 then counts.count else 0 end) AS Res1 
    , SUM(case when counts.count = 107 then counts.count else 0 end) AS Res2 
FROM counts 
WHERE counts.name IN (104,107) 
     AND counts.count > 0 
GROUP BY YEAR(counts.ts) 
ORDER BY YEAR(counts.ts) 
; 

作为样本数据,现已通过sqlfiddle实例提供,下面是现在有关。请注意,上面的查询,如查询是问题,条件错误地基于列counts.count而不是counts.name。一旦纠正了完全相同的查询结构,就会提供结果。 (请注意,我可能不知道这一点没有看到数据。)

SQL Fiddle

的MySQL 5.6架构设置

DROP TABLE IF EXISTS `counts`; 
CREATE TABLE `counts` (
    `id` int(15) NOT NULL AUTO_INCREMENT, 
    `name` varchar(16) DEFAULT NULL, 
    `ts` datetime DEFAULT NULL, 
    `count` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UniqueDataIndex` (`name`,`ts`,`count`) USING BTREE 
) ENGINE=InnoDB AUTO_INCREMENT=475152 DEFAULT CHARSET=utf8; 

INSERT INTO `counts` VALUES ('475026', '107    ', '2015-01-27 10:18:00', '40'); 
INSERT INTO `counts` VALUES ('475032', '104    ', '2015-01-27 10:20:00', '11'); 
INSERT INTO `counts` VALUES ('475039', '107    ', '2015-01-27 10:22:00', '109'); 
INSERT INTO `counts` VALUES ('475046', '104    ', '2015-01-27 10:24:00', '92'); 
INSERT INTO `counts` VALUES ('475052', '107    ', '2015-01-27 10:26:00', '124'); 
INSERT INTO `counts` VALUES ('475058', '104    ', '2016-01-27 10:28:00', '98'); 
INSERT INTO `counts` VALUES ('475069', '107    ', '2016-01-27 10:32:00', '77'); 
INSERT INTO `counts` VALUES ('475075', '104    ', '2016-01-27 10:34:00', '44'); 
INSERT INTO `counts` VALUES ('475081', '107    ', '2016-01-27 10:36:00', '43'); 
INSERT INTO `counts` VALUES ('475087', '104    ', '2016-01-27 10:38:00', '89'); 
INSERT INTO `counts` VALUES ('475093', '107    ', '2016-01-27 10:40:00', '89'); 

查询1

SELECT 
     YEAR(counts.ts) as SalesYear 
    , SUM(case when counts.name = '104' then counts.count else 0 end) AS Res1 
    , SUM(case when counts.name = '107' then counts.count else 0 end) AS Res2 
FROM counts 
WHERE counts.name IN ('104','107') 
     AND counts.count > 0 
GROUP BY YEAR(counts.ts) 
ORDER BY YEAR(counts.ts) 

Results

| SalesYear | Res1 | Res2 | 
|-----------|------|------| 
|  2015 | 103 | 273 | 
|  2016 | 231 | 209 | 
+0

道歉,有连接问题,它应该使用'IN(104,107)'我没有替换一个等号 –

+0

注意虽然你的代码更具可移植性,但在MySQL中,你可以简单地使用SUM(x = 104)语法 – Strawberry

+0

@Strawberry感谢人们可以使用IF();我只是更喜欢case表达式的自我记录本质以及它们在大多数情况下的适用性sql dbms –