2017-01-06 12 views
1

私はSecuritySecurityTransactionsの2つのテーブルを持っています。SQLでのクエリによるグループ

Security

create table security(SecurityId int, SecurityName varchar(50)); 

insert into security values(1,'apple'); 

insert into security values(2,'google'); 

insert into security values(3,'ibm'); 

SecurityTable

create table SecurityTransactions(SecurityId int, Buy_sell boolean, Quantity int); 

insert into securitytransactions values (1 , false, 100); 

insert into securitytransactions values (1 , true, 20); 

insert into securitytransactions values (1 , false, 50); 

insert into securitytransactions values (2 , false, 120); 

私はセキュリティ上の名前を知りたいんし、それがSecurityTransactionsに外観のないです。

答えは以下の通りです:

 
SecurityName | Appearance 
apple  | 3 
google  | 1 

私は、以下のSQLクエリを書いた:

select S.SecurityName, count(t.securityID) as Appearance 
from security S inner join securitytransactions t on S.SecurityId = t.SecurityId 
group by t.SecurityId, S.SecurityName; 

このクエリは私に望ましい結果を与えたが、それはまだで、人と言っグループによって拒否されましたはs.securityNameだったはずです。それはどうしてそうですか?

編集:

これは正しいですか?なぜですか?

a。グループ別t.SecurityId、S.securityName

b。グループによってt.SecurityId

c。グループによるS.securityName

+0

質問を編集していただきありがとうございました! – PramTal

+0

あなたは 'GROUP BY'について聞いているようです。 MySQLの古いデフォルトの振る舞いは寛容で、 'GROUP BY'には存在しない' SELECT'に列を含めることができますが、ほとんどの他のRDBMSはそのクエリを拒否します。さらに、動作はMySQL 5.7ではデフォルトで_offであるため、これに依存することは推奨されません。また、別のRDMBSに切り替えるときに悪い習慣があることもあります。 http://stackoverflow.com/questions/38907729/mysql-5-7-only-full-group-by –

+0

マイケル、次に正しいクエリは何でしょうか? – PramTal

答えて

2

ANSI SQLによれば、group by句を使用すると、選択リストにはgroup by句内の項目、その単一行変換、または集計式の項目のみが含まれます。 MySQLは標準ではなく、他のカラムも許可します。このケースでは、SecuirtyIdSecurityNameの間に1対1の関係があるため、正解を生成していましたが、一般的に言えば、これはコードを理解しにくくし、最悪の場合には予​​測できない悪い習慣です。

EDIT:
編集した質問に対処するには - SecuirtyIdSecurityName両方によってグループ分けはそれだけで冗長ですが、技術的には間違っていないです。 2つの列の間に1対1の関係があるため、group by句にSecurityId列を追加しても結果は変わらず、クエリを読んでいる人を混乱させるだけです。

+0

申し訳ありませんが、現在、両方のフィールドを含むgroup by節で元のクエリを更新しました。今すぐお勧めできますか? – PramTal

+0

Mureinik、SecurityIdだけでグループ化するとどうなりますか?その場合、それは正しいでしょうか?また、あなたは単にSecurityNameでグループを書くべきですか? – PramTal

+0

@PramTal 'Group by SecurityId;は(技術的に)間違っています(いくつかのMySQLバージョンでは許可されていますが)。あなたのケースでは技術的にうまくいくでしょう(しかし、技術的に間違っているわけではありません)。しかし、実際には考慮すべきことがあります。同じ名前/異なるIDを持つ2つの企業を持つことができれば、 。とにかく、現在、それは論理的にそこに属していません:あなたは名前でグループ化したいです。だから、名前でグループ化する。 't.SecurityId + 1、t.SecurityId + 3、S.SecurityName;でグループ化することは技術的にも機能しますが、なぜそれを書くのかあなた自身に尋ねるでしょう。 – Solarflare

関連する問題