查询以遍历数据并为每个唯一值提供表

问题描述 投票:0回答:2

我正在尝试编写查询以遍历特定表中的数据并返回每种类型的结果。我想出了一些逻辑,我想无论如何我只是知道它会因为我丢失了某些东西而无法工作。

我正在使用的数据的结构如下:

        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

我从以下逻辑开始,但我知道这是行不通的:

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
sql sql-server
2个回答
0
投票

您似乎想要group byorder by

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

我不知道您为什么要尝试执行循环来做到这一点。您应该只在SQL中使用基于集合的逻辑。


0
投票

您可以使用汇总和窗口功能按交付类型获得前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;
© www.soinside.com 2019 - 2024. All rights reserved.