我有一张表data
看起来像这样
idOne | date | input
------------------
1 | 2015-01-01 | 423
2 | 2015-01-01 | 342
1 | 2015-01-02 | 343
2 | 2015-01-02 | 332
在这张桌子上我做了:
SELECT date, SUM(input)
FROM data
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
GROUP BY date
这给了我这个输出:
date | input
------------------
2015-01-01 | 765
2015-01-02 | 675
我的数据库中还有一个表info
:
idTwo | idOne | label
------------------
1 | 1 | 'Hello, '
2 | 2 | 'World!'
3 | 1 | 'Hello, '
4 | 2 | 'World!'
正如您所看到的,这个数据库没有完全规范化,但这就是我所拥有的。
我想按label
语句中的SELECT
值进行过滤。这令我头疼!每次我尝试我的行都会多次相加。例如:
SELECT date, SUM(input)
FROM data, info
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
AND data.idOne = info.idOne
AND label = 'Hello,'
GROUP BY date
两次求和,并给出了这个输出:
date | input
------------------
2015-01-01 | 1530
2015-01-02 | 1350
我该如何解决这个问题?感谢。
答案 0 :(得分:1)
如果您想要第一张表中的准确总和,那么您可能需要exists
:
SELECT date, SUM(input)
FROM data d
WHERE date BETWEEN '2015-01-01' AND '2015-01-02' AND
EXISTS (SELECT 1 FROM info i WHERE d.idOne = i.idOne AND i.label = 'Hello,')
GROUP BY date;
您还应学习使用显式join
语法。简单规则:切勿在{{1}}子句中使用逗号。
答案 1 :(得分:0)
总和加倍,如您所料,因为行连接了两次,因为id在第二个表中出现两次。
您需要做的是从第二个表中提取该ID,使其显示一次。您必须决定是否要在第二个表中使用id最高或最低的行,但如果您想要max,请尝试以下操作:
SELECT MAX(idTwo), idOne, label
FROM info
GROUP BY idOne, label;
然后,因为每个idOne只有一行(希望如此。这不能保证,因为你的表没有像你说的那样进行规范化),你可以将它加入数据并获得你想要的信息:
SELECT dateCol, SUM(input)
FROM data
JOIN(
SELECT MAX(idTwo), idOne, label
FROM info
GROUP BY idOne, label) tmp ON data.idOne = tmp.idOne
GROUP BY data.idOne;
以下是SQL Fiddle示例。
答案 2 :(得分:-1)
SELECT date, SUM(input) FROM data
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
AND idOne in (SELECT idtwo FROM info where label = 'Hello,')
GROUP BY date
答案 3 :(得分:-1)
SELECT date, SUM(input)
FROM data, (select distinct idOne from info where label = 'Hello') as info
WHERE date BETWEEN "2015-01-01" AND "2015-01-02"
AND data.idOne = info.idOne
GROUP BY date