我正在尝试编写查询以遍历特定表中的数据并返回每种类型的结果。我想出了一些逻辑,我想无论如何我只是知道它会因为我丢失了某些东西而无法工作。
我正在使用的数据的结构如下:
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
您似乎想要group by
和order by
:
select delivery_type, customer_id, count(*)
from deliveries
group by delivery_type, customer_id
order by delivery_type, customer_id;
我不知道您为什么要尝试执行循环来做到这一点。您应该只在SQL中使用基于集合的逻辑。
您可以使用汇总和窗口功能按交付类型获得前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;