从Query中获取MAX值

时间:2013-12-28 22:30:05

标签: sql sql-server sql-server-2008 visual-studio-2012

我想获得MAX的{​​{1}}值并显示相应的SalesMadeEmployee.FirstName。此查询返回每个员工的销售计数。你能帮我算出MAX值吗?我不熟悉子查询。提前致谢。

Employee.LastName

2 个答案:

答案 0 :(得分:0)

您不需要子查询。假设您的确意味着总销售额而不是每天的销售额:

SELECT top 1 e.FirstName, e.LastName, COUNT(*) AS SalesMade
FROM Employees e INNER JOIN
     Sales s
     ON e.EmployeeId = s.EmployeeID
GROUP BY e.EmployeeId, e.FirstName, e.LastName
ORDER BY SalesMade desc;

top 1仅返回第一行,由于order by子句,这将是最大行。

答案 1 :(得分:0)

我的主要问题是什么是业务逻辑?

您是否想要获得每天,每月或每年销售额最高的员工的姓名?

另外,您是在寻找销售总数还是最高销量?

这些都可以是有效的查询。

我喜欢创建几个测试表并将它们加载到tempdb中,以便使用示例主键和外键来播放(销售/员工)。

由于HOBBIT在电影中,我在12月24日以12/26的价格销售了Bilbo 2,并在12月26日进行了1次销售。另一方面,Gandalf在12月24日进行了1次销售,在12月26日有3次销售

-- Just playing around
use tempdb;
go

-- employee table
if object_id('employees') > 0 
drop table employees
go

create table employees
(
   employee_id int identity(1,1) primary key,
   first_name varchar(25),
   last_name varchar(25)
);
go

-- add data
insert into employees values
('bilbo', 'baggins'),
('gandalf', 'the grey');
go

-- show data
select * from employees
go

-- sales table
if object_id('sales') > 0 
drop table sales
go

create table sales
(
   sales_id int identity(1,1) primary key,
   employee_id int,
   sales_date datetime,
   sales_amount money
);

-- add data
insert into sales values
(1, '12/24/2013', 100),
(1, '12/24/2013', 200),
(2, '12/24/2013', 300),
(2, '12/26/2013', 100),
(2, '12/26/2013', 200),
(2, '12/26/2013', 300),
(1, '12/24/2013', 100);
go

-- make sure their is integrity
alter table sales add constraint [fk_employee_id] 
foreign key (employee_id) references employees (employee_id);

-- show data
select * from sales
go

此简单查询返回每位员工每天的总销售额。

-- Total Sales per Day per employee
SELECT 
    s.sales_date, 
    e.last_name, 
    e.first_name, 
    COUNT(*) AS total_sales
FROM employees e INNER JOIN sales s
ON e.employee_id = s.employee_id
GROUP BY 
    s.sales_date,
    e.last_name, 
    e.first_name

enter image description here

我注意到你最后在月份和年份添加了DATEPART?您是否想要每月​​获得销售额?

-- Total Sales per Month per employee
SELECT 
    datepart(yyyy, s.sales_date) * 100 + datepart(mm, s.sales_date) as date_key, 
    e.last_name, 
    e.first_name, 
    COUNT(*) AS total_sales
FROM employees e INNER JOIN sales s
ON e.employee_id = s.employee_id
GROUP BY 
    datepart(yyyy, s.sales_date) * 100 + datepart(mm, s.sales_date), 
    e.last_name, 
    e.first_name
ORDER BY total_sales desc;

enter image description here

简而言之,前1名只会在您查看特定日期或月份时提供帮助。如果您希望在一天或几个月的范围内看到每日或每月的最佳销售人员,将无效

请澄清业务逻辑,以便我能为您提供准确的解决方案。