首页 > 解决方案 > 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 ; . . . 该程序产生所需的结果。为什么第二条是必要的?我这样做是否正确

感谢指导。谢谢。

标签: sqlselectgroup-byvisual-foxpro

解决方案


原因是 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 ;


推荐阅读