PHP数据库查询 - 按月分组

时间:2013-03-20 18:29:44

标签: sql sql-server

根据建议编辑:

$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

2 个答案:

答案 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

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