【发布时间】:2017-12-13 20:48:52
【问题描述】:
我正在使用 SQL Server 2016,但我遇到了一个问题,它按多个列进行分组,并在省略重复行的同时找到平均值。我有一个事务表定义为:
CREATE TABLE [dbo].[CUST_TRANSACTION](
[EXTRACT_DATE] [date] NULL,
[CUSTOMER_ID] [bigint] NULL,
[TRANS_NUMBER] [bigint] NULL,
[CATEGORY] [smallint] NULL,
[RANKING] [smallint] NULL )
这是一些数据:
EXTRACT_DATE CUSTOMER_ID TRANS_NUMBER CATEGORY RANKING
10/31/2017 10001 1000101 4 100
10/31/2017 10001 1000102 4 100
10/31/2017 10002 1000201 4 200
10/31/2017 10001 1000103 5 100
10/31/2017 10003 1000301 5 300
10/31/2017 10003 1000302 5 300
10/31/2017 10004 1000401 7 500
10/31/2017 10001 1000104 8 100
Customer_Id AND TRANS_NUMBER 组合必须是唯一的,但 customer_id 可以有 1 到多个 Trans_Number,而 Customer_Id 可以存在于 1 到多个类别中。从我查看的数据来看,对于给定的 EXTRACT_DATE,Customer_ID 的排名似乎是相同的。我在排名中没有发现 NULLS,但我确实找到了零,所以我需要从平均值中排除任何零。
请求是生成按每个类别 (1 - 15) 细分的报告并找到该类别中的平均排名,但只计算一次 customer_id 并找到该类别的最大排名。这是针对给定的 EXTRACT_Date。
所以我运行了以下内容:
Select CATEGORY, MAX(RANKING) "Max Ranking", AVG(RANKING) "Average Ranking"
from CUST_TRANSACTION
where EXTRACT_DATE = Convert(datetime, '2017-10-31' )
and RANKING > 1
group by CATEGORY
order by CATEGORY
生成以下输出:
CATEGORY Max Ranking Average Ranking
4 200 133
5 300 233
7 500 500
8 100 100
但是类别 4 的平均值应该是 150,因为 customer_Id = 10001 有两个条目,类别 5 应该是 = 200,因为 Customer_id 10003 有两个条目。
当我尝试按 Category、Customer_Id 进行分组时,输出包括 Category 和 Customer_Id 的每个组合,这就是 Group by 所做的。所以我不确定我是否需要子选择或任何其他想法?
谢谢
【问题讨论】:
标签: sql-server