我5年来第一次被重新投入MySQL。编写查询以运行一些报告。首先,我需要在第1部分找到按照Color ID分配多少加仑油漆。分部与我们的所有交易在不同的表格中找到。我写了这个查询 -
SELECT m.divName,
n.colorName,
n.colorID,
SUM(n.gallons) as totalGallons
FROM mfccnStore m, netTran2014 n
WHERE (m.division = 1) AND (m.store = n.store)
GROUP BY colorID
ORDER BY totalGallons DESC
INTO OUTFILE '/home/Div1All.csv'
FIELDS TERMINATED BY ',';
跑吧,然后测试它,我选择了一种最常用的颜色并写了这个查询 -
SELECT m.divName,
n.colorName,
n.colorID,
n.gallons
FROM mfccnStore m, netTran2014 n
WHERE (n.colorID = "6385") AND (m.division = 1) AND (m.store = n.store)
INTO OUTFILE '/home/DoverWhite.csv'
FIELDS TERMINATED BY ',';
然后验证颜色ID“6385”的总计在运行每个查询后匹配,他们这样做了。大。
但是现在它变得有点复杂,需要第3张桌子,因为他们想要相同的报告,但是被“内部”和“外部”涂料隔开。
SELECT m.divName,
n.colorName,
n.colorID,
SUM(n.gallons) as totalGallons
FROM mfccnStore m, netTran2014 n, netProduct p
WHERE ((p.intExt = "INTERIOR") AND (m.division = 1) AND (m.store = n.store))
AND ((n.rex = p.prodNbr) AND (n.sizeCode = p.szCd))
GROUP BY colorID
ORDER BY totalGallons DESC
INTO OUTFILE '/home/Div1Int.csv'
FIELDS TERMINATED BY ',';
这给了我比其他两个查询多一倍的总数,我确信它必须与我的WHERE子句的顺序 - 以及括号的放置位置。任何想法/帮助将不胜感激。
答案 0 :(得分:1)
首先,我建议使用JOIN
语法。然后它读起来像这样:
SELECT m.divName,
n.colorName,
n.colorID,
p.intExt
SUM(n.gallons) totalGallons
FROM mfccnStore m
JOIN netTran2014 n ON m.store = n.store
JOIN netProduct p ON n.rex = p.prodNbr AND n.sizeCode = p.szCd
WHERE p.intExt IN ('INTERIOR','EXTERIOR')
AND m.division = 1
GROUP BY n.colorID, p.intExt
ORDER BY totalGallons DESC
注意放在GROUP BY
中的哪些字段 - 大多数RDBMS要求包含所有未包含在聚合函数中的字段。 MySQL更灵活,但可以返回不准确的结果。
答案 1 :(得分:0)
你不需要过度复杂化它。可以使用额外的GROUP BY子句处理分解,在本例中为GROUP BY p.intExt;