Запрос, который будет подсчитывать текстовые значения и возвращать строку с наименьшим значением (мин)? - PullRequest
0 голосов
/ 14 ноября 2018

Хотите знать, если кто-то может помочь с этим запросом, мне нужно написать запрос, который будет подсчитывать магазины, основываясь на этом расположении штата, а затем отображать местоположение штата с наименьшим количеством для страны. Каждый код страны должен быть представлен только один раз.

это то, что я до сих пор: -

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 ]

0 голосов
/ 14 ноября 2018

Использовать оконные функции:

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().

0 голосов
/ 14 ноября 2018

вы можете использовать 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
...