Запрос, который будет подсчитывать текстовые значения и возвращать строку с наименьшим значением (мин)?
Хотите знать, если кто-то может помочь с этим запросом, мне нужно написать запрос, который будет подсчитывать магазины, основываясь на этом расположении штата, а затем отображать местоположение штата с наименьшим количеством для страны. Каждый код страны должен быть представлен только один раз.
это то, что я до сих пор:-
select
CountryRegionCode]
, [StateProvinceCode]
, COUNT(PSP.StateProvinceID) as [No. of Stores]
from [Sales].[Store] as SS
inner join [Person].[BusinessEntityAddress] as PBEA on SS.BusinessEntityID = PBEA.BusinessEntityID
inner join [Person].[Address] as PA on PBEA.AddressID = PA.AddressID
inner join [Person].[StateProvince] as PSP on PA.StateProvinceID = PSP.StateProvinceID
group by
CountryRegionCode
,StateProvinceCode
having
count(PSP.StateProvinceID) =
(select min(a.cnt)
from (select count(PSP.StateProvinceID) as cnt from [Sales].[Store] as SS2
inner join [Person].[BusinessEntityAddress] as PBEA2 on SS2.BusinessEntityID = PBEA2.BusinessEntityID
inner join [Person].[Address] as PA2 on PBEA2.AddressID = PA2.AddressID
inner join [Person].[StateProvince] as PSP2 on pa2.StateProvinceID = PSP2.StateProvinceID
group by
CountryRegionCode) as a)
order by CountryRegionCode
Я приложил текущий вывод, как я могу ограничить вывод, чтобы показывать только строки, выделенные желтым цветом? Например, штат с наименьшим количеством магазинов для каждой страны.
(Мне не разрешено использовать верхнее предложение)
заранее спасибо
2 ответа
Используйте оконные функции:
select cs.*
from (select CountryRegionCode, StateProvinceCode,
count(*) as num_stores,
rank() over (partition by CountryRegionCode order by count(*) desc) as seqnum
from [Sales].[Store] ss join
[Person].[BusinessEntityAddress] pbea
pbeaon ss.BusinessEntityID = pbea.BusinessEntityID inner join
[Person].[Address] pa
on pbea.AddressID = pa.AddressID inner join
[Person].[StateProvince] psp
on pa.StateProvinceID = psp.StateProvinceID
group by CountryRegionCode, StateProvinceCode
) cs
where seqnum = 1;
Если есть связи, это возвращает все государства с самыми большими значениями в пределах страны. Если вы хотите только один, то используйте row_number()
вместо rank()
,
Ты можешь использовать min()
функция
with cte as
(
select
CountryRegionCode]
, [StateProvinceCode]
, COUNT(PSP.StateProvinceID) as no_of_store
from [Sales].[Store] as SS
inner join [Person].[BusinessEntityAddress] as PBEA on SS.BusinessEntityID = PBEA.BusinessEntityID
inner join [Person].[Address] as PA on PBEA.AddressID = PA.AddressID
inner join [Person].[StateProvince] as PSP on PA.StateProvinceID = PSP.StateProvinceID
group by
CountryRegionCode
,StateProvinceCode
having
count(PSP.StateProvinceID) =
(select min(a.cnt)
from (select count(PSP.StateProvinceID) as cnt from [Sales].[Store] as SS2
inner join [Person].[BusinessEntityAddress] as PBEA2 on SS2.BusinessEntityID = PBEA2.BusinessEntityID
inner join [Person].[Address] as PA2 on PBEA2.AddressID = PA2.AddressID
inner join [Person].[StateProvince] as PSP2 on pa2.StateProvinceID = PSP2.StateProvinceID
group by
CountryRegionCode) as a)
), cte2 as
(
select *,
min(no_of_store) over(partition by CountryRegionCode order by
CountryRegionCode ) as rn from cte
) select * from cte2 where rn=1