根据建议编辑:
$sql=
"SELECT SysproCompanyJ.dbo.InvMovements.StockCode,
SysproCompanyJ.dbo.InvMaster.Description,
SysproCompanyJ.dbo.InvMovements.TrnYear,
SysproCompanyJ.dbo.InvMovements.Warehouse,
SysproCompanyJ.dbo.InvMovements.TrnMonth,
SysproCompanyJ.dbo.InvMovements.TrnQty,
SysproCompanyJ.dbo.InvMovements.TrnValue
FROM SysproCompanyJ.dbo.InvMovements,
SysproCompanyJ.dbo.InvMaster
WHERE SysproCompanyJ.dbo.InvMovements.StockCode = SysproCompanyJ.dbo.InvMaster.StockCode
AND SysproCompanyJ.dbo.InvMovements.Warehouse = 'S2'
GROUP BY SysproCompanyJ.dbo.InvMovements.TrnMonth";
示例数据库数据为:
Stockcode | Description | TrnYear | Warehouse | TrnMonth | TrnQty | TrnValue
PN1 | Part Number 1 | 2013 | S2 | 1 | 100 | 10.00
PN2 | Part Number 2 | 2013 | S2 | 1 | 200 | 125.00
PN3 | Part Number 3 | 2013 | S2 | 1 | 200 | 60.00
PN1 | Part Number 1 | 2013 | S2 | 2 | 300 | 560.00
PN4 | Part Number 4 | 2013 | S2 | 2 | 400 | 30.00
PN5 | Part Number 5 | 2013 | S2 | 2 | 100 | 230.00
我正在尝试将数据分解为按月分组的单独表格,然后使用变量将每月的总TrnValue相加。
当前查询原因是出现以下错误
警告:odbc_exec()[function.odbc-exec]:SQL错误:[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]列'SysproCompanyJ.dbo.InvMovements.StockCode'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。在第69行的C:\ wamp \ www \ dacs \ S2_2.php中的SQLExecDirect中的SQL状态37000
答案 0 :(得分:0)
您不能在select语句中使用列,除非它们位于聚合函数(min,max,sum,count,...)内或包含在Group By中。
尝试这样的事情:
SELECT SysproCompanyJ.dbo.InvMovements.Warehouse,
SysproCompanyJ.dbo.InvMovements.TrnYear,
SysproCompanyJ.dbo.InvMovements.TrnMonth,
Sum(SysproCompanyJ.dbo.InvMovements.TrnQty) as sum_TrnQty,
Sum(SysproCompanyJ.dbo.InvMovements.TrnValue) as sum_TrnValue
FROM SysproCompanyJ.dbo.InvMovements,
SysproCompanyJ.dbo.InvMaster
WHERE SysproCompanyJ.dbo.InvMovements.StockCode = SysproCompanyJ.dbo.InvMaster.StockCode
AND SysproCompanyJ.dbo.InvMovements.Warehouse = 'S2'
GROUP BY SysproCompanyJ.dbo.InvMovements.Warehouse,
SysproCompanyJ.dbo.InvMovements.TrnYear,
SysproCompanyJ.dbo.InvMovements.TrnMonth
在任何类型的聚合中包含varchar列(Stockcode,Description)通常没有意义,因为它们是不同的值,您可能不希望它们在Group By中。
答案 1 :(得分:0)
在SQL查询中使用GROUP BY
时,显示的所有字段都应该是“分组”或计算(聚合)值。
例如;
SELECT city, count(*), avg(price) FROM properties GROUP BY city;
这会产生类似的东西;
City | count | Avg
Paris | 3 | 166.666
将计算每个城市的行数。城市是'group by'的一部分。 'count(*)'和'avg(price)'是计算列(聚合)。
如果我们要在查询中引入另一列,'city';
SELECT country, city, count(*), avg(price) FROM properties GROUP BY city;
查询会出错,因为country
既不是“分组”也不是计算值。这个错误很合乎逻辑;城市名称在世界范围内并不是唯一的(例如,“巴黎”美国和法国的“巴黎”),因此仅按城市分组,数据库无法显示唯一的国家/地区名称。
要解决此问题,请在组中包含“country”,或将其设为计算字段;
SELECT country, city, count(*), avg(price) FROM properties GROUP BY country, city;
将返回按国家/地区分组的结果,然后按城市
Country | City | count | Avg
USA | Paris | 1 | 100.000
France | Paris | 2 | 200.000
使用国家/地区的计算值;
SELECT min(country), city, count(*), avg(price) FROM properties GROUP BY country, city;
将返回按城市分组的结果,以及组中的“第一个”国家/地区:
min(Country)| City | count | Avg
France | Paris | 3 | 166.666
这可能不符合逻辑;结果显示'法国',但它包括来自美国巴黎的结果