Запрос к L oop через данные и предоставление таблицы для каждого уникального значения - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь написать запрос в l oop через данные из указанной таблицы c и вернуть результаты для каждого типа. Я кое-что из логики c понял, я думаю, в любом случае, я просто знаю, что это не будет работать, потому что я что-то упускаю.

Данные, с которыми я работаю, структурированы так:

        Customer ID     Delivery Type
    143             Delayed
    123             Delivered 
    14              In Process
    123             In Route
    432             Delivered 
    456             Delayed
    76              In Route
    34              In Route
    546             Delayed
    324             Delivered 
    235             In Process
    678             Delayed
    234             In Route
    123             In Route
    321             Delayed
    987             In Process
    546             In Process
    324             Delayed
    235             In Route
    678             In Process
    234             Delayed
    123             In Route
    321             Delivered 
    987             In Process

Я пытаюсь получить такой результат:

Delivery Type   Customer ID  Count
Delayed         143             1
Delayed         234             1
Delayed         321             1
Delayed         324             1
Delayed         456             1
Delayed         546             1
Delayed         678             1

Delivery Type   Customer ID  Count
Delivered       123             1
Delivered       321             1
Delivered       324             1
Delivered       432             1

Delivery Type   Customer ID  Count
In Process      14              1
In Process      235             1
In Process      546             1
In Process      678             1
In Process      987             2

Delivery Type   Customer ID  Count
In Route        34              1
In Route        76              1
In Route        123             3
In Route        234             1
In Route        235             1

Я начал со следующей логики c, которая, как я знаю, не будет работать:

DECLARE @i int
DECLARE @DeliveryCount int
DECLARE @Type int

@type = Select distinct DeliveryType from Deliveries

@DeliveryCount = select count(*) as 'Count' from @type

SET @i = 0

WHILE @DeliveryCount > @i
BEGIN 
    @DeliveryType = Select row @i from @type

    @Top10 = SELECT TOP 10 count(*) as 'Count', CustomerID, DeliveryType FROM Deliveries
            Group by CustomerID, DeliveryType
            Where DeliveryType like @DeliveryType
    Print @Top10

    Set @i = @i + 1
END

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вы можете получить 10 лучших клиентов по типу доставки с функциями агрегации и окна:

select *
from (
    select 
        DeliveryType, 
        CustomerID, 
        count(*),
        rank() over(partition by DeliveryType order by count(*) desc) rn
    from Deliveries
    group by DeliveryType, CustomerID
) t
where rn <= 10
order by DeliveryType, CustomerID, rn;

В качестве альтернативы, вы также можете использовать top 1 with ties - это устраняет необходимость в подзапросе, но не Позвольте вам отсортировать результаты:

select top (1) with ties
    DeliveryType, 
    CustomerID, 
    count(*)
from Deliveries
group by DeliveryType, CustomerID
order by (rank() over(partition by DeliveryType order by count(*) desc) - 1) / 10
0 голосов
/ 11 марта 2020

Похоже, вы хотите group by и order by:

select delivery_type, customer_id, count(*)
from deliveries
group by delivery_type, customer_id
order by delivery_type, customer_id;

Я понятия не имею, почему вы попытаетесь сделать все это oop. Вы должны просто использовать основанную на множестве логи c в SQL.

РЕДАКТИРОВАТЬ:

Основываясь на вашем комментарии, используйте оконные функции:

select d.*
from (select delivery_type, customer_id,
             count(*) as cnt,
             row_number() over (partition by delivery_type order by count(*) desc) as seqnum
      from deliveries
      group by delivery_type, customer_id
     ) d
where seqnum <= 10
order by delivery_type, customer_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...