我在Bsc上遇到了一些SQL问题。 CS修订试卷 - 我知道你们都不喜欢回答学术问题,但这是我的最后一招(周一考试的修订版),我不知道如何去做。
我有两张桌子:
Department (deptId: string, deptName: string, managerId: string)
Employee (empId: string, empName: string, jobName: string, salary: integer, deptId: string)
我需要运行和2个查询:
1)显示编号最大的部门的名称和ID 员工
2)显示员工平均工资至少的部门名称 40000
我相信我需要在这里使用join
和having
,但这些都是我无法解决的问题。
所以我的问题是,我将如何编写这些查询?我本身并不需要答案,而是知道如何实现目标的解释方法。同样,这不是学术工作,而是期末考试的修订。
答案 0 :(得分:1)
使用Rank并确定谁= 1.为简单起见,请尝试创建子查询:按部门ID分组并获取员工数。
Select
d.deptid, d.deptName, Average(e.salary)
from Department as d
inner join Employee as e
on d.deptId = e.deptId
group by d.deptid, d.deptName
having Average(e.salary) >= 40000
答案 1 :(得分:1)
你必须清楚的事情是2个表连接的内容和方式是什么?
如果您深入了解表结构:
Department
(deptId: string, deptName: string, managerId: string)
Employee
(empId: string, empName: string, jobName: string, salary: integer, deptId: string)
您可以看到deptId
是公共字段,因此是这些表的连接键。
(可能是部门的主键和emmployee的外键)
如果确实是主键,则字符串是最佳datatype
选择。
现在,您可以继续进行join query
我想为你的问题提供确切的解决方案我只是给你一个连接语句的语法:
Select * from Table1 join Table2 on Table1.samefield=Table2.samefield where='condition'
答案 2 :(得分:1)
首先,您希望有一个表格,其中包含来自Department
和Employee
的信息。这是这些表之间INNER JOIN
的经典用例。
ON
条款是什么? 此时,您将获得一张包含所有员工及其各自部门的表格。
之后,你可以使用这个表和group by,count(),order by,并为你的第一个问题/组选择top 1,为你的第二个问题/ avg()选择。
奖金:现在你可能想知道,如果两个部门有相同数量的员工会怎样?
答案 3 :(得分:0)
首先加入你的两张桌子。
查看结果,看看你需要添加什么。对于第一个想到按某种东西排序可能会选择一定数量的结果。对于第二个,您将不得不为该连接添加一些内容。也许是要聚合的子查询等。
SQL是一种用于试错的漂亮语言。速度快,可立即获得结果。如果您没有环境,请尝试使用SQL Fiddle。
答案 4 :(得分:0)
/*, managerId VARCHAR(100)*/
DECLARE @Department TABLE (deptId VARCHAR(100), deptName VARCHAR(100))
DECLARE @Employee TABLE (empId VARCHAR(100), empName VARCHAR(100), jobName VARCHAR(100), salary INT, deptId VARCHAR(100))
INSERT INTO @Department (deptId, deptName) VALUES ('IT','Tech')
INSERT INTO @Department (deptId, deptName) VALUES ('ST','Stores')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('A','AAA',10000,'IT')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('B','AAA',20000,'IT')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('C','AAA',30000,'ST')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('D','AAA',220000,'ST')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('E','AAA',12000,'ST')
/*Department with the largest number of employees*/
SELECT
TOP 1 DP.deptId, DP.deptName, COUNT(EE.deptId) AS NoEmployees
FROM
@Department AS DP
INNER JOIN @Employee AS EE
ON DP.deptId = EE.deptId
GROUP BY
DP.deptId , DP.deptName
ORDER BY
COUNT(EE.deptId) DESC
/*Department with the largest number of employees*/
SELECT
DP.deptId, DP.deptName, AVG(EE.salary) AS NoEmployees
FROM
@Department AS DP
INNER JOIN @Employee AS EE
ON DP.deptId = EE.deptId
GROUP BY
DP.deptId , DP.deptName
HAVING
AVG(EE.salary)>40000
ORDER BY
COUNT(EE.deptId) DESC