0

根据建议进行编辑:

$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 Driver][SQL Server]Column 'SysproCompanyJ.dbo.InvMovements.StockCode' 在选择列表中无效,因为它不包含在内在聚合函数或 GROUP BY 子句中。第 69 行 C:\wamp\www\dacs\S2_2.php 中的 SQLExecDirect 中的 SQL 状态 37000

4

2 回答 2

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 中。

于 2013-03-20T20:16:54.577 回答
0

在 SQL 查询中使用GROUP BY时,显示的所有字段都应按“分组”或计算(聚合)值。

例如;

SELECT city, count(*), avg(price) FROM properties GROUP BY city;

这会产生类似的东西;

 City   |  count  |   Avg
 Paris  |  3      |   166.666

将计算每个城市的行数。城市是“分组依据”的一部分。'count(*)' 和 'avg(price)' 是计算列(聚合)。

如果我们要在查询中引入另一列,“城市”;

SELECT country, city, count(*), avg(price) FROM properties GROUP BY city;

该查询会出错,因为country既不是“分组”也不是计算值。这个错误很合乎逻辑;城市名称在全球范围内不是唯一的(例如“Paris”美国和“Paris”在法国),因此仅按城市分组,数据库无法显示唯一的国家名称。

要解决此问题,请在分组依据中包含“国家”,或将其设为计算字段;

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

这可能不合逻辑;结果显示“法国”,但它包括来自美国巴黎的结果

于 2013-03-20T20:26:21.490 回答