4

最近、SQL Where ステートメント/グループ化に関する質問をここに投稿しました。

GROUP または RANK からの WHERE を使用する SQL ステートメント

今、私はいくつかのフォローアップを持っています。

前の質問と同様に、次の列を含む 35,000 行のテーブルがあるとします。

営業担当 | 親アカウント ID| アカウント ID | 総契約額 | 日にち

各行はアカウント ID ごとに個別ですが、複数のアカウント ID が親アカウント ID に該当する場合があります。

最初の質問の回答と同様に、これはおそらくテーブル w/ia テーブルになるでしょう。最初に、すべてを営業担当者別にグループ化する必要があります。それから、すべてのアカウントのグループ化された合計契約値が >= 10,000 である親アカウント ID ですべてをグループ化する必要があります。次に、すべてが表示され、親アカウント ID の合計 TCV によってランク付けされます。エージェントごとに上位 35 の親アカウント ID が必要です。

したがって、データの最初の数行は次のようになります。

営業担当 | 親アカウント 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 は 1 つの最大の TCV を持っていますが、親アカウント ID ParentABC12345 のグループ化された値がより大きいため、2 番目にランク付けされています。したがって、35 の親アカウント ID のランキングがありますが、そのランキングでは実際のデータが 100 行以上になる可能性があります。

何かご意見は?

4

2 に答える 2

3

フォローいつも嬉しいです。「親ランク」は として追加されますINNER JOIN

編集:ダン・ブラクックが正しく述べたように、私の最初の答えは正しくありませんでした。正しい条件を満たすようにクエリを変更しました。親アカウントにもタイムスパンを適用しました。

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 に答える