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";

サンプルDBデータは次のようになります。

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 SQLServerドライバー][SQLServer]列'SysproCompanyJ.dbo.InvMovements.StockCode'が含まれていないため、選択リストで無効です集計関数またはGROUPBY句のいずれかで、69行目のC:\ wamp \ www \ dacs\S2_2.phpのSQLExecDirectのSQL状態37000

4

2 に答える 2

0

集計関数 (min、max、sum、count、...) 内にあるか、Group By に含まれていない限り、select ステートメントで列を使用することはできません。

次のようなことを試してください:

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

都市ごとの行数をカウントします。都市は「group by」の一部です。「count(*)」と「avg(price)」は計算列(集計)です。

クエリに別の列を導入するとしたら、'city';

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

countryは「グループ化」された値でも計算された値でもないため、クエリはエラーを返します。このエラーは非常に論理的です。都市名は世界中で一意ではないため (たとえば、米国の「パリ」とフランスの「パリ」)、都市だけでグループ化すると、データベースは一意の国名を表示できません。

これを解決するには、group by に「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

これはおそらく論理的ではありません。結果には「フランス」が表示されますが、パリ、米国の結果が含まれています

于 2013-03-20T20:26:21.490 に答える