0

売上高が最も高い従業員を取得しようとしています

Employee    DeptNo  Date        Sales
Chris       2       2012/1/1    1000
Joe         1       2012/1/1    900
Arthur      3       2012/1/1    1100
Chris       2       2012/3/1    1200
Joe         1       2012/2/1    1500
Arthur      3       2010/2/1    1200
Joe         1       2010/3/1    900
Arthur      3       2010/3/1    1100
Arthur      3       2010/4/1    1200
Joe         1       2012/4/1    1500
Chris       2       2010/4/1    1800

2 つのサブクエリを使用して、それらを比較してより高い値を見つけようとしました

SELECT c1.Employee,
       c1.TOTAL_SALES
FROM  (SELECT Employee,
              Sum(sales) AS TOTAL_SALES
       FROM   EmployeeSales
       GROUP  BY Employee) c1,
      (SELECT Employee,
              Sum(sales) AS TOTAL_SALES
       FROM   EmployeeSales
       GROUP  BY Employee) c2
WHERE  ( c1.TOTAL_SALES > c2.TOTAL_SALES
         AND c1.Employee > c2.Employee ) 

しかし、結果のクエリは私に2行を与えます

Employee    TOTAL_SALES
joe         4800
joe         4800

私は何を間違っていますか?

4

5 に答える 5

2

CTEを使用します。

;With [CTE] as (
    Select
        [Employee]
        ,sum([Sales]) as [Total_Sales]
        ,Row_Number()
            Over(order by sum([sales]) Desc) as [RN]
    From [EmployeeSales]
    Group by [Employee]
)
Select
    [Employee]
    ,[Total_Sales]
From [CTE]
Where [RN] = 1

動作コードの例 SQL Fiddle: http://sqlfiddle.com/#!3/bd772/2

于 2012-07-11T13:09:48.080 に答える
1

総売上高が最も高いすべての従業員を返すには、SQL Server 独自の TOP WITH TIES を使用できます。

SELECT TOP (1) WITH TIES name, SUM(sales) as total_sales
FROM employees
GROUP BY name
ORDER BY SUM(sales) DESC
于 2012-07-11T06:02:50.887 に答える
0
SELECT name, SUM(sales) as total_sales
FROM employees
GROUP BY name
ORDER by total_sales DESC
LIMIT 1;

より良い解決策は、従業員 ID でグループ化して、同一人物であることを確認することです。2人のクリスがいる可能性があるので。

于 2012-07-10T22:27:38.667 に答える
0

ウィンドウパーティションを使用します

select * from
(
    select
        employee
    ,   sum(sales) as sales
    ,    row_number() over
    (
         order by sum(sales) desc
    ) as rank
    from EmployeeSales
    group by employee
) tmp
where tmp.rank = 1

そして、名前ではなく、従業員IDとグループ化について誰かが言ったこと(ショーン)に同意します。

(これには必要ないため、row_number() 呼び出しからパーティションを削除しました)

于 2012-07-10T22:44:28.100 に答える
0

そのためにCTEを使用できます

WITH CTE AS ( select employee , sum(sales) as sales, ROW_NUMBER() OVER (PARTITION BY employee ORDER BY sum(sales) desc) RN FROM EmployeeSales) SELECT employee , sales FROM CTE WHERE RN =1

于 2012-07-11T06:07:12.840 に答える