sql - SQL 选择 - 分组依据
问题描述
非常从 SQL 开始。
我正在尝试从几个表中收集数据以生成摘要,其中第一个表中的值按字段 Repcode 分组并总计。在结果游标中,将通过查找 Repcode 字段从第二个表中获取描述。
这是一个非常简化的测试程序
CREATE CURSOR Nomtot (tcode C(4), tRepcode C(2), tBalance N(9,2))
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("A001", "12", 123.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B003", "17", 555.45)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("B006", "19", 666.00)
INSERT INTO nomtot (tCode, tRepcode, tBalance) VALUES ("E008", "12", 810.00)
CREATE CURSOR RepLook (tRepcode C(2), tDesc C(30))
INSERT INTO Replook(tRepcode, tDesc) VALUES ("12", "Materials")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("17", "Carriage")
INSERT INTO Replook(tRepcode, tDesc) VALUES ("19", "Dividends")
SELECT a.tRepcode, SUM(a.tBalance) AS tBalance, b.tDesc ;
FROM Nomtot a, Replook b ;
GROUP BY a.tRepcode ;
WHERE a.tRepcode = b.tRepcode ;
INTO CURSOR cResult
但是,这会产生错误:SQL GROUP BY 命令丢失或无效。如果我然后将语句更改为 GROUP BY a.tRepcode, b.tDesc ; . . . 该程序产生所需的结果。为什么第二条是必要的?我这样做是否正确
感谢指导。谢谢。
解决方案
原因是 SQL 需要聚合所有非计算的列。
在 SAS 等其他语言中,它不是必需的,但您的计算将仅基于 group by 的内容。换句话说,您的 SUM(a.tBalance) 对于所有 b.tDesc 将具有相同的值。在您的情况下,它可能是一对一的匹配,这并不重要,但在其他情况下,您的 b.Table 可能有多个匹配的值并且应该有不同的总和...... tDesc in group by :
select a.*, b.tDesc from (SELECT a.tRepcode, SUM(a.tBalance) AS tBalance FROM Nomtot) a inner join Replook b
on a.tRepcode = b.tRepcode ;
推荐阅读
- ubuntu - Ubuntu 无法 sudo apt-get update
- html - CSS white-space: normal 在 Firefox 中因同级 span 元素而失败
- r - 在 R 中绘制海洋边界
- python - 如何在列表中找到最大和最小数字的位置?
- python - 如何使用 XGB 有效地转换 150 多个分类变量以获得特征重要性?
- gradle - org.gradle.util.VersionNumber 的继承者是什么
- r - plot.window(...) 中的错误:需要 R Markdown 中的有限“xlim”值
- python - 请求验证
- assembly - 汇编中的间接寻址 (x86)
- javascript - 如何从 Postgres 表中仅删除当前消息而不是 Nextjs 中的所有消息