2017-09-28 24 views
0

私はGROUP BY句にいくつか問題があります。私はもともとMySQLでSQLを教えていましたが、最近SQLサーバーに転送しました。しかし、私は本当にGROUP BY句で苦労しています。GROUP BY(MySQLとSQLサーバ)

私はのようなクエリを作成することができることに使用されています:

Name  Team  Date Figure 
    Ben  2  16/09  30 
    Simon  4  16/09  55 

しかし、私は、SQLサーバーのIで同じことをコーディング:これは私のような結果を与えるだろう

SELECT Name,Team,Date, SUM(Figure) 
    FROM Table 
    GROUP BY Name 

を私のselect節のすべての列をGROUP BYする必要があります。そうでなければエラーです。

SELECT Name,Team,Date, SUM(Figure) 
    FROM Table 
    GROUP BY Name,Team,Date 

結果:

Name  Team  Date Figure 
    Ben  2  16/09  10 
    Ben  2  19/09  20 
    Simon  4  16/09  35 
    Simon  4  20/09  20 

名前、チーム、日付でグループ化されているためです。

私はSQLサーバーでMySQLにあったような結果を得ようとしていますが、これは可能ではないようです。誰もがこの状況のた​​めのアドバイスを持っていますか?

おかげSQL Serverで

+1

あなたのMySQLクエリは実行してはいけません。それは意味をなさない。MySQLがBenの19/09ではなくDate 16/09を選択する方法を教えてください。 – Eric

+0

MySQLはstrictモードでしかそれについて不平を言っていますが、最初のクエリが間違っています。 –

+0

MySQL以外のdbmsでは、最初のクエリが意味をなさないので失敗します。 – Eric

答えて

3

をあなたが関与GROUP BY他のすべての列を使用して適切に集約する必要があります。あなたの結果を達成するために次のものが必要です。

SELECT Name,Team,MIN(Date), SUM(Figure) 
FROM Table 
GROUP BY Name,Team 

あなたは大きな日付をしたい場合は、MAX代わりのMINを使用しています。私はMySQLに精通していませんが、あなたの結果は適切な集約なしには可能ではありません。 MySqlはどちらの日付を選択するのか、どの個人にどのような日付が選択されるのか、どのように選択すればよいでしょうか?

0

このクエリ:

SELECT Name, Team, Date, SUM(Figure) 
FROM Table 
GROUP BY Name 

は意味がありません。 TeamDateにはどのような値が使用されますか?

MySQLは、ONLY_FULL_GROUP_BYオプション(here参照)を使用してANSI準拠の動作を推奨し始めています。 MySQLのドキュメントでも使用しているクエリのスタイルに対して助言:

は、[クエリを可能にする] ONLY_FULL_GROUP_BYを無効に有用である主にあなたが知っているとき、そのデータの 起因するいくつかのプロパティ、すべての値でGROUP BYに名前が付けられていない各非集約 列は、各グループで同じです。

ANSI標準SQLおよびほぼすべての他のデータベースでは、集計されていないすべての列/式の周りに集計関数が必要です。ような何か:

SELECT Name, MAX(Team) as team, MAX(Date) as last_date, SUM(Figure) 
FROM Table 
GROUP BY Name; 

それはあなたがMySQLを知ったとき、あなたが悪い習慣と非ポータブル構文を学んだことは悲しいです。