2017-01-06 2 views
1

У меня есть 2 стола, Security и SecurityTransactions.Группа по запросу в 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. почему это так ?

EDIT:

Какой из них вам это правильно и почему?

a. группа по t.SecurityId, S.securityName

b. группа по t.SecurityId

c. group by S.securityName

+0

Thanks Willem для редактирования вопроса! – PramTal

+0

Похоже, вы спрашиваете о 'GROUP BY'. Старое поведение MySQL по умолчанию является мягким и позволяет включать столбцы в 'SELECT', отсутствующие в' GROUP BY', но большинство других СУБД отклонят этот запрос. Кроме того, по-умолчанию поведение _off по-умолчанию_ в MySQL 5.7, поэтому не рекомендуется полагаться на него, и иметь плохую привычку при переключении на другой RDMBS. http://stackoverflow.com/questions/38907729/mysql-5-7-only-full-group-by –

+0

Майкл, что тогда будет правильным вопросом? – PramTal

ответ

2

Согласно ANSI SQL, если вы используете предложение group by, ваш список выбора может содержать только элементы в предложении group by, преобразования одной строки или агрегированные выражения. MySQL нестандартен и позволяет использовать и другие столбцы. В этом случае это привело к правильному ответу, так как между SecuirtyId исуществует связь 1: 1, но, как правило, это плохая практика, которая сделает ваш код в лучшем случае понятным и непредсказуемым.

EDIT:
Для решения отредактированного вопроса - группировка оба SecuirtyId и SecurityName не является технически неправильно, это просто излишним. Поскольку между двумя столбцами существует соотношение 1: 1, добавление столбца SecurityId в пункт group by не изменяет результат и просто путает людей, читающих запрос.

+0

Извините, я обновил свой первоначальный запрос с помощью команды group by now, которая включает оба поля, не могли бы вы предложить сейчас? – PramTal

+0

Mureinik, что делать, если я группирую только с SecurityId? в этом случае, будет ли это правильно? Кроме того, вы имеете в виду, что я должен просто написать группу по SecurityName? – PramTal

+0

@PramTal 'group by SecurityId;' будет (технически) ошибочным (хотя некоторые версии mysql позволяют это); 'group by SecurityId, SecurityName;' будет технически работать в вашем случае (так что это не так уж и сложно) - но есть на самом деле что-то рассмотреть: обе версии будут вести себя по-другому, если вы можете иметь две компании с одинаковым именем/разными идентификаторами , Во всяком случае, в настоящее время он не принадлежит логически: вы хотите группировать имя. Итак, группа по имени. 'group by t.SecurityId + 1, t.SecurityId + 3, S.SecurityName;' тоже будет технически работать, но вы спросите себя, почему я напишу THAT. – Solarflare

 Смежные вопросы

  • Нет связанных вопросов^_^