2015-12-04 196 views
8

私は、次のエラーメッセージCOUNTフィールド間違っているか、構文エラー

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[07002]: [Microsoft][ODBC Driver 11 for SQL Server]COUNT field incorrect or syntax error'...

を取得するときにエラーになり何これは私がSOに質問を検索しました私は

$sql = $pdo->prepare("SELECT stockamount, stockname, stockbalance.stockid, SUM(ABS(reservationtransaction.stockquantity)) AS reservedamount FROM stockbalance 
    JOIN stock ON stockbalance.stockid = stock.stockid 
    LEFT JOIN reservationtransaction ON reservationtransaction.articleid = :artid 
    WHERE stockbalance.articleid = :artid AND ((changeddate > DATEADD(yy,-1,GETDATE()) AND inventorydate > DATEADD(yy,-1,GETDATE())) OR stockbalance.stockamount <> 0) 
    GROUP BY stockbalance.stockid"); 
$sql->bindValue(':artid', $productId); 
$sql->execute(); 

を使用しているクエリですが、誰も似ていない、または役に立たなかった。
ありがとうございます。

編集:このクエリは、Microsoft SQL Server Management Studioで実行すると問題なく動作しますが、PDOを使用するとエラーが発生します。

+0

ユニークな名前を持っている必要があります'MIN'のような集合メソッドなしでそれらを選択することはできません。 –

+1

MySQLのバックグラウンドを持っていると思います。http://stackoverflow.com/questions/33629168/group-by-clause-in-mysql-and-postgresql-why-the-error-in-postgresql/33629201#33629201要点は、MySQLの集約動作はANSIの苦情ではありません。 – lad2025

+0

エラーメッセージごとに、これはPDOExceptionであり、SQL例外ではありません。結果セットとバインドしようとしているオブジェクトが一致していない可能性がありますか? –

答えて

15

The number of parameters specified in SQLBindParameter was less than the number of parameters in the SQL statement contained in *StatementText. SQLBindParameter was called with ParameterValuePtr set to a null pointer, StrLen_or_IndPtr not set to SQL_NULL_DATA or SQL_DATA_AT_EXEC, and InputOutputType not set to SQL_PARAM_OUTPUT, so that the number of parameters specified in SQLBindParameter was greater than the number of parameters in the SQL statement contained in *StatementText. SQLExecute Function

プレースホルダは、あなたの `stockamount`と` stockname`があなたのように、 `GROUP BY`の一部ではない、彼らは同じ値を持っていても

$sql = $pdo->prepare("SELECT stockamount, stockname, stockbalance.stockid, SUM(ABS(reservationtransaction.stockquantity)) AS reservedamount FROM stockbalance 
JOIN stock ON stockbalance.stockid = stock.stockid 
LEFT JOIN reservationtransaction ON reservationtransaction.articleid = :artid 
WHERE stockbalance.articleid = :artid2 AND ((changeddate > DATEADD(yy,-1,GETDATE()) AND inventorydate > DATEADD(yy,-1,GETDATE())) OR stockbalance.stockamount <> 0) 
GROUP BY stockbalance.stockid"); 
$sql->bindValue(':artid', $productId); 
$sql->bindValue(':artid2', $productId); 
$sql->execute(); 
+0

これは問題でした!ご回答有難うございます。 – lingo

1

算術関数に含まれていないすべての列は、GROUP BY句に入れる必要があります。以下を参照:

SELECT stockamount, 
     stockname, 
     stockbalance.stockid, 
     Sum(Abs(reservationtransaction.stockquantity)) AS reservedamount 
FROM stockbalance 
     INNER JOIN stock 
       ON stockbalance.stockid = stock.stockid 
     LEFT JOIN reservationtransaction 
       ON reservationtransaction.articleid = :artid 
WHERE stockbalance.articleid = :artid 
     AND ((changeddate > Dateadd(yy, -1, Getdate()) 
       AND inventorydate > Dateadd(yy, -1, Getdate())) 
       OR stockbalance.stockamount <> 0) 
GROUP BY stockamount, 
      stockname, 
      stockbalance.stockid 
+1

私はそれを試みましたが、それは助けになりません。私はまだ 'SQLSTATE [07002]:[Microsoft] [SQL Server用ODBCドライバ11] COUNTフィールドが正しくないか構文エラーです。 – lingo

関連する問題