0

結果を ID と日付の両方でグループ化する SQL クエリを Mysql で作成しています。日付は動的に決定され、単純な日時フィールド、または年と月または週の組み合わせのいずれかになります。年のケースについては、以下のクエリを参照してください。

SELECT t.transactionId, t.transactionDate, t.transactionProcessDate, 
t.status, t.type, t.versionId, t.note, WEEKOFYEAR(t.transactionDate) as CW, 
YEAR(t.transactionDate) as yr, (DATE_FORMAT(t.transactionDate, '%Y-%u')) as tDate
FROM transaction t 
WHERE (t.status = 'A' or t.status = 'N') 
GROUP BY t.transactionId , tDate

私が抱えている問題は、tDate でグループ化しようとすることです。

GROUP BY t.transactionId , tDate

同じ日付の重複を返します。

クエリを CW フィールドと yr フィールドでグループ化するように変更すると、

GROUP BY t.transactionId , CW, yr

重複することなく、期待される結果が得られます。

質問:によって生成されたフィールドによるグループ化に問題がありDATE_FORMAT、返されたクエリで重複を認識できない可能性がありますか?
グループ化にのみ使用される CW と yr の 2 つのフィールドをクエリから完全に除外したいと思います。

4

1 に答える 1

2

更新まず第一に、実際のデータが表示されていないと判断するのは難しいですが、問題なくGROUP BY DATE_FORMAT(t.transactionDate, '%Y-%u')動作します

SELECT transactionId, 
       DATE_FORMAT(transactionDate, '%Y-%u') tDate
       ...
  FROM transaction
 WHERE status IN('A', 'N') 
 GROUP BY transactionId, tDate

ここにSQLFiddleがあります

余談ですが、MySqlはフィールド(あなたの場合はt.status、t.typeなど)を指定することを許可していますが、それSELECTGROUP BY良いことではありません。MAXそのフィールド ( 、MIN...)に集計関数を適用する必要があります。そのようなフィールドのどの値を取得するかを決定論的に伝える方法はありません。GROUP BY

于 2013-05-23T08:51:33.480 に答える