4

我最近在这里发布了一个关于 SQL Where 语句/分组的问题:

使用来自 GROUP 或 RANK 的 WHERE 的 SQL 语句

现在我有了一些跟进。

与上一个问题类似,假设我有一个包含 35,000 行的表,其中包含这些列:

销售代表 | 父帐户 ID| 帐号 | 合同总价值 | 日期

每行都按帐户 ID 单独显示,但多个帐户 ID 可以属于一个父帐户 ID。

与第一个问题的回答类似,这可能是一个带有表格的表格。因此,首先,所有内容都必须按销售代表分组。从那以后,所有内容都需要按父帐户 ID 分组,其中所有帐户的分组总合同价值 >= 10,000。然后所有内容都将显示并按父帐户 ID 的总 TCV 排名,我需要代理的前 35 个父帐户 ID。

所以前几行数据可能如下所示:

销售代表 | 父帐户 ID| 帐号 | 合同总价值 | 日期 | 秩
约翰·多伊 | 父ABC12345 | ABC425 | 5,000 | 2013 年 1 月 2 日 |1
约翰·多伊 | 父ABC12345 | ABC426 | 10,000 | 2013 年 1 月 2 日 |1
约翰·多伊 | 家长DJE12345 | DJE523 | 11,000 | 2013 年 1 月 2 日 |2
约翰·多伊 | 父FBC12345 | FBC6723 | 4,000 | 2013 年 1 月 2 日 |3
约翰·多伊 | 父FBC12345 | FBC6727 | 4,000 | 2013 年 1 月 2 日 |3

请注意排名是如何根据父帐户 ID 进行的。帐户 ID DJE523 具有最大的单个 TCV,但它排名第二,因为父帐户 ID ParentABC12345 的分组值更大。因此会有 35 个父帐户 ID 的排名,但在该排名中,它们可能是 100 多行实际数据。

有什么想法吗?

4

2 回答 2

3

总是很高兴跟进。“父等级”添加为INNER JOIN.

编辑:正如 Dan Bracuk 正确提到的,我的第一个答案是不正确的。我更改了查询以满足正确的条件。我还将时间跨度应用于父帐户。

DECLARE @minimumValue decimal(20,2) = 10000
DECLARE @numberOfAccounts int = 35
DECLARE @from datetime = '1/1/2013'
DECLARE @till datetime = DATEADD(MONTH, 1, @from)

SELECT 
  [sub].[Sales Rep],
  [sub].[Rank],
  [sub].[Account ID],
  [sub].[Total Contract Value],
  [sub].[Parent Account ID],
  [sub].[Total],
  [sub].[ParentRank]
FROM
(
  SELECT
    [s].[Sales Rep],
    [s].[Account ID],
    [s].[Total Contract Value],
    DENSE_RANK() OVER (PARTITION BY [s].[Sales Rep] ORDER BY [s].[Total Contract Value] DESC) AS [Rank],
    [p].[Parent Account ID],
    [p].[Total],
    [p].[ParentRank]
  FROM [Sales] [s]
  INNER JOIN 
  (
    SELECT
      [Parent Account ID],
      SUM([Total Contract Value]) AS [Total],
      RANK() OVER(ORDER BY SUM([Total Contract Value]) DESC) AS [ParentRank]
    FROM [Sales]
    WHERE[Date] > @from AND [Date] < @till
    GROUP BY [Parent Account ID]
    HAVING SUM([Total Contract Value]) > @minimumValue
  ) AS [p] ON [s].[Parent Account ID] = [p].[Parent Account ID]
  WHERE [Date] > @from AND [Date] < @till
) AS [sub]
WHERE [sub].[Rank] <= @numberOfAccounts
ORDER BY 
  [Sales Rep] ASC,
  [ParentRank] ASC,
  [Rank] ASC

这是一个新的 Fiddle

于 2013-02-04T22:20:08.830 回答
-1

如果您使用的是 SQL Server,我认为这将为您完成:

Select top 35 
    SalesRep, 
    ParentAccountId, 
    sum(TotalContractValue)  from Table
group by SalesRep, ParentAccountId 
order by sum(TotalContractValue) desc
于 2013-02-04T22:03:43.213 回答