2014-11-14 5 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 году (есть 'Start' Дата, содержащий 2012). Не знаете, с чего начать!

4. Удалите все записи, в которых поле «Имя» сотрудника пусто/пусто.

Моя попытка:

DELETE FROM Employee 
WHERE Name=NULL; 

Я делаю что-то не так с моими попытками? Любая помощь будет оценена по достоинству. СПАСИБО!

+2

Вы что-то делаете неправильно? Почему вы спрашиваете? Вы ошибаетесь? –

+2

Во-первых, мы имеем дело с sql-server или mysql? вы не можете использовать оба тега - выберите один. Во-вторых, я рекомендую искать присоединения в качестве следующего шага - вам это понадобится для ваших зарплат в лондонском запросе. Кроме того, ваша структура таблицы указывает, что у сотрудника может быть более одного адреса, связанного с ними. Используйте COUNT (DISTINCT EmployeeID) в этом запросе вместо COUNT (Город), чтобы получить более точный результат. –

ответ

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, таблица зарплата не имеет столбца «Город». Вам необходимо зарегистрироваться в таблице Employee:

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 

вы можете удалить, где EmployeeID равно нулю из всех таблиц, если это возможно, чтобы иметь записи там

+0

Я предположил, что вы используете SQL Server (T-SQL), ваши теги вводят в заблуждение - вы не можете быть MySQL и SQL Server –

0

Это не был рассмотрен в других ответах:

  1. Подсчитайте количество сотрудников, которые живут в городе Лондон

Ваша попытка ниже даст вам правильный ответ , только если есть другой сотрудник в строке.

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

Если ваш адрес таблица выглядит, как он делает ниже, используя запрос, который вы написали, вы получите 3 сотрудников (но мы можем видеть из таблицы есть только два различные EmployeeID так, таким образом, только 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'; 

Это поможет вам правильный ответ каждый раз, независимо от того, что ваша таблица выглядит.