2014-11-14 64 views
0

我刚刚开始学习如何编写SQL查询,我还有很多要学习的知识和很多问题,主要是关于定义SQL查询的条件。我有3个表(下面列出的字段):有条件的SQL

Employee: 
EmployeeID, Name, DoB, StartDate 

Salary: 
SalaryID, DataPaid, AmountPaid, EmployeeID 

Address: 
AddressID, Address, City, EmployeeID 

现在我想知道如何:
1.计算住在伦敦金融城的员工人数。

我尝试:

SELECT COUNT(City) AS EmployeeID FROM Address 
WHERE City='London'; 

2.所有员工加入了 'AmountPaid' 值从伦敦金融城。

我尝试:

SELECT SUM(AmountPaid) AS TotalPaid FROM Salary 
WHERE City='London'; 

3.在2012年开始的所有员工的显示数据(有一个 '开始日期' 含2012)。不知道从哪里开始!

4.删除员工“姓名”字段为空/空的所有记录。

我尝试:

DELETE FROM Employee 
WHERE Name=NULL; 

难道我做错了我的企图?任何帮助,将不胜感激。 谢谢!

+2

你在做什么错吗?你为什么要问?你得到错误的结果? – 2014-11-14 15:11:36

+2

首先,我们是处理sql-server还是mysql?你不能使用两个标签 - 选择一个。其次,我建议查找连接作为下一步 - 在伦敦查询中,您需要为您的薪水需要。此外,您的表结构表明一名员工可能拥有多个与其关联的地址。在该查询中使用COUNT(DISTINCT EmployeeID)而不是COUNT(城市)以获得更准确的结果。 – 2014-11-14 15:17:52

回答

2

在SQL Server(T-SQL)中,无法使用'='测试NULL的值。它必须是如下:

Delete From Employee Where Name IS NULL 
1

此外,我会检查空的名字:

DELETE FROM Employee where Name IS NULL OR Name='' 

对于点3:

SELECT * FROM Employee WHERE Year(StartDate)=2012 

至于点2,表中工资没有城市专栏。您需要像这样加入员工表:

SELECT SUM(AmountPaid) AS TotalPaid FROM Salary SA inner join Employee Em on Em.EmployeeID=SA.EmployeeID WHERE Em.City='London'; 
1

闻起来有点像家庭作业。总之:

(1)在伦敦金融城的员工数
首先声明似乎是正确的我,是不是?但这个别名让我困惑了一下,因为它说EmployeeID,但是返回的值是员工的数量。

(2)伦敦市
支付员工总量这不会同你说工作,因为表Salary没有现场City。你需要在这里联接:

select sum(AmountPaid) as TotalPaid 
    from Salary s 
    join Address a on s.EmployeeID = a.EmployeeID 
    where a.City = 'London' 

(3)员工在2012年
在这里,您可以使用YEAR函数来提取出一年之日起开始:

select * 
    from Employee 
    where Year(StartDate) = 2012 

( 4)删除未命名的员工
采取从@ericpap的解决方案(为了完整性):

delete from Employee 
    where Name is NULL 
    or Name = '' 
0

我会这样做 - 它包括一个测试,通过测试,您可以制作表格和数据以帮助您了解它的工作原理;

我假设员工只有一个地址,但接受多次付款,虽然可能没有必要从您的示例中的员工表中加入,但它显示了员工与其他表之间的关系是如何工作的,这可能有助于你更好地理解关系模型。

--Make the Tables 

CREATE TABLE dbo.Employee 
(
EmployeeID BIGINT PRIMARY KEY NOT NULL, 
Name VARCHAR(50), 
DoB DATE, 
StartDate DATE 
) 

CREATE TABLE dbo.Salary 
(
SalaryID BIGINT PRIMARY KEY NOT NULL, 
DatePaid DATE, -- I think you mean DatePaid and not DataPaid 
AmountPaid MONEY, 
EmployeeID BIGINT 
) 

CREATE TABLE dbo.Address 
(
AddressID BIGINT PRIMARY KEY NOT NULL, 
[Address] VARCHAR(max), 
City VARCHAR(200), 
EmployeeID BIGINT 
) 

-- Put in some Test Data 

INSERT INTO dbo.Employee (EmployeeID,Name, DoB, StartDate) 
VALUES (1,'Bill Gates','19551028','20121014'), 
     (2,'Larry Ellison','19440817','20140101') 


INSERT INTO dbo.Address (AddressID,[Address], City, EmployeeID) 
VALUES (1,'15 Microsoft House','New York',1), 
     (2,'23 Oracle Flats','London',2) 

INSERT INTO dbo.Salary(SalaryID, DatePaid, AmountPaid, EmployeeID) 
VALUES (1,Getdate(),5000.53,1), 
     (2,'20140201',10000.23,2), 
     (3,'20140301',10000.23,2) 

-- Queries; 

--Count the number of employees that live in the city of London. 

SELECT COUNT(Distinct E.EmployeeID) as Count_London 
FROM dbo.Employee E 
INNER JOIN dbo.[Address] A 
    ON E.EmployeeID = A.EmployeeID 
WHERE A.City = 'London' 

-- Result = 1 

-- 2. Add up the 'AmountPaid' values for all employees from the city of London 

--Total Amount 

SELECT Sum(S.AmountPaid) as TotalPaid 
FROM dbo.Employee E 
INNER JOIN dbo.[Address] A 
    ON E.EmployeeID = A.EmployeeID 
LEFT JOIN dbo.Salary S 
    ON E.EmployeeID = S.EmployeeID 
WHERE A.City = 'London' 

-- Result = 20000.46 (2 x 10000.23) 

--split by employee; 
SELECT E.EmployeeID,E.Name,Sum(S.AmountPaid) as TotalPaid 
FROM dbo.Employee E 
INNER JOIN dbo.[Address] A 
    ON E.EmployeeID = A.EmployeeID 
LEFT JOIN dbo.Salary S 
    ON E.EmployeeID = S.EmployeeID 
WHERE A.City = 'London' 
GROUP BY E.EmployeeID, E.Name 

--3. Display data for all employees that started in 2012 

SELECT * 
FROM dbo.Employee E 
INNER JOIN dbo.[Address] A 
    ON E.EmployeeID = A.EmployeeID 
LEFT JOIN dbo.Salary S 
    ON E.EmployeeID = S.EmployeeID 
WHERE StartDate >= '20120101' AND StartDate < '20130101' 
-- result = all bill gates fields 

-- 4. Delete all records where the employee 'Name' field is empty/null. 

DELETE FROM dbo.Employee WHERE EmployeeID IS NULL 

你可能想要删除其中雇员是从所有表空,如果有可能在那里

+0

我假设你正在使用SQL Server(T-SQL)你的标签有误导性 - 你不能同时使用MySQL和SQL Server – 2014-11-14 15:54:22

0

这是不是在其他的答案解决的记录:

  1. 统计住在伦敦市的雇员人数

只有当每行有不同的员工时,您的下面的尝试才会得到正确的答案

SELECT COUNT(City) AS EmployeeID FROM Address 
WHERE City='London'; 

如果您的地址表看起来像它下面,使用你写的查询,你会得到3名员工(但我们可以从表中看到的只有2个不同的雇员的这么因此,只有2名员工)。

AddressID, Address, City, EmployeeID 
1, 1 Main St, London, 1 
2, 2 Main St, London, 2 
3, 3 Main St, London, 1 

你应该做的是计算不同的EmployeeID的数量。这些EmployeeID中的每一个都标识一个独特的员工。因此,您的查询应该如下所示:

SELECT COUNT(DISTINCT EmployeeID) AS EmployeeID FROM Address 
WHERE City='London'; 

无论您的表是什么样,每次都会得到正确的答案。