==
сравнивает ссылки на объекты.
.equals()
сравнивает значения String.
Иногда ==
дает иллюзии сравнения значений String, как в следующих случаях:
String a="Test";
String b="Test";
if(a==b) ===> true
Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:
(a == b) ===> true
String Pool
b -----------------> "test" <-----------------a
Однако ==
не выполняется в следующем случае:
String a="test";
String b=new String("test");
if (a==b) ===> false
В этом случае для new String("test")
оператор new String будет создан в куче, и эта ссылка будет указана на b
, поэтому b
будет дана ссылка на кучу, а не на String pool.
Теперь a
указывает на String в пуле String, а b
указывает на String в куче. Из-за этого мы получаем:
, если (a == b) ===> false.
String Pool
"test" <-------------------- a
Heap
"test" <-------------------- b
Пока .equals()
всегда сравнивает значение String, поэтому дает true в обоих случаях:
String a="Test";
String b="Test";
if(a.equals(b)) ===> true
String a="test";
String b=new String("test");
if(a.equals(b)) ===> true
Таким образом, использование .equals()
всегда лучше.
Из требования я понимаю, что в каждой категории должна быть 1 строка, должно быть указано количество продавцов и указано имя продавца с самой последней датой.
Я подготовил нижеприведенный запрос, который генерирует некоторые примеры данных и предоставляет результат, как я понимаю.
Способ, которым это работает, заключается в том, что объем продавца рассчитывается путем присоединения таблицы категории продавца к таблице категории и последующего подсчета идентификатора продавца для каждой категории. Название более хитрое и требует использования внешнего применения, которое для каждой категории (для каждой строки) определяет первое имя в таблице торговца, упорядоченное по max (date) desc
. Надеюсь, это поможет, любые вопросы, пожалуйста, дайте мне знаю.
declare @Merchant table (
MerchantId int,
Name nvarchar(25),
Date Date
);
declare @MerchantCategory table (
MerchantId int,
CategoryId int
);
declare @Category table (
CategoryId int,
Name nvarchar(25)
);
insert into @Merchant (MerchantId, Name, Date)
values
(1, 'Lucy', '2019-01-05'),
(2, 'Dave', '2019-01-30'),
(3, 'Daniel' ,'2019-02-01');
insert into @MerchantCategory (MerchantId, CategoryId)
values
(1, 4),
(1, 5),
(2, 4),
(3, 5);
insert into @Category (CategoryId, Name)
values
(4, 'Cat1'),
(5, 'Cat2');
select c. Name, max(m.name) as MaxMerchantName, count(distinct mc2.merchantid) as Merchantvol from @Category c
left join @MerchantCategory mc2 on c.CategoryId=mc2.CategoryId
outer apply (select top 1 name, max(date) as date from @Merchant m inner join @MerchantCategory mc on m.MerchantId=mc.MerchantId where c.CategoryId=mc.CategoryId group by Name order by max(date) desc) m
group by c.Name;
Я бы ожидал увидеть ваши усилия ..
, так что я иду против SO принципов @ на данный момент ..
попробуйте это:
select c.Name as category_name, count(*) as Merchant_Count, m.Name as Merchant_Name, max(Date) from
Merchant m join MerchantCategory mc
on m.MerchantId = mc.MerchantId
join Category c
on mc.CategoryId = c.CategoryId
group by c.Name, m.Name