2014-11-14 2 views
0

최근에는 SQL 쿼리를 작성하는 방법을 배우기 시작했으며 SQL 쿼리 조건 정의와 관련하여 많은 것을 배우고 많은 질문을했습니다.조건부 SQL

Employee: 
EmployeeID, Name, DoB, StartDate 

Salary: 
SalaryID, DataPaid, AmountPaid, EmployeeID 

Address: 
AddressID, Address, City, EmployeeID 

지금 내가하고 싶은 방법을 알고 : 1.
런던의 도시에 거주하는 직원의 수를 계산 나는 (아래에 나열된 필드) 3 개 테이블이있다.

내 시도 :

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

2. 런던의 도시에서 모든 직원에 대해 'AmountPaid'값을 추가 할 수 있습니다.

내 시도 : 2012 년에 시작한 모든 직원

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

3. 표시 데이터 (A '시작 날짜'2012 포함이). 이것으로 어디에서 시작해야할지 확실하지 않습니다!

4. 직원 '이름'필드가 비어 있거나 null 인 모든 레코드를 삭제하십시오.

내 시도 :

DELETE FROM Employee 
WHERE Name=NULL; 

나는 나의 시도에 뭔가를하고 있습니까? 어떤 도움을 주시면 감사하겠습니다. 감사합니다.

+2

somethig를 잘못하고 있습니까? 왜 묻는거야? 잘못된 결과가 나옵니까? –

+2

우선, 우리는 sql-server 또는 mysql을 다루고 있습니까? 두 태그를 모두 사용할 수 없습니다. 하나를 선택하십시오. 둘째, 다음 단계로 조인을 찾는 것이 좋습니다. 런던 쿼리에서 급여를 위해 필요합니다. 또한 테이블 구조는 직원이 두 개 이상의 주소를 가질 수 있음을 나타냅니다. 더 정확한 결과를 얻으려면 COUNT (도시) 대신 해당 쿼리에서 COUNT (DISTINCT EmployeeID)를 사용하십시오. –

답변

2

SQL Server (T-SQL)에서 '='을 사용하여 NULL 값을 테스트 할 수 없습니다. 또한

Delete From Employee Where Name IS NULL 
1

난 빈 이름을 확인합니다 : : 점 3으로

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

: 지점 2에 관해서는

SELECT * FROM Employee WHERE Year(StartDate)=2012 

, 테이블 급여를 다음과 같이이어야합니다 City 열이 없습니다. 다음과 같이 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라고 말하면서 조금 혼란 스럽지만 반환 값은 직원 수입니다. 테이블 Salary 더 필드 City이 없기 때문에 런던
의 도시에 직원을 지불

(2) 총 금액이 당신의 문으로 작동하지 않을 것입니다.당신은 여기에 조인해야합니다 :

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

(3) 직원이 다음은 구식 해 추출 YEAR 기능을 사용할 수 있습니다
2012 년에 시작 :

select * 
    from Employee 
    where Year(StartDate) = 2012 

(4) 익명의 직원을 삭제하십시오
@ 문자 PAP의 해결책에서 취한 것입니다 (완전성을 위해) :

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 

직원 ID는 모든 테이블에서 null 인 곳이

+0

나는 당신이 태그가 오해의 소지가있는 SQL 서버 (T-SQL)를 사용한다고 가정 했으므로 MySQL과 SQL 서버가 될 수는 없다 –

0

이것은 다른 답변에서 해결되지 않은 레코드를 가질 수 있다면 당신은 삭제할 수 있습니다

런던의 도시에 거주하는 직원의 수를 계산

행당 다른 직원이있는 경우 아래에서 시도하면 의 올바른 대답을 얻을 수 있습니다. (만 2 별개의 직원 ID 년대 따라서 단지 2 명의 직원 그래서이있다 그러나 우리는 테이블에서 볼 수있다) 당신이 쓴 쿼리를 사용하여, 아래에하는 것처럼 당신의 주소 테이블이 보인다면

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

, 당신은 3 명의 직원을 얻을 것입니다.

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

고유 한 EmployeeID의 수를 계산하면됩니다. 이 EmployeeID는 고유 한 직원을 식별합니다. 따라서 쿼리는 다음과 같아야합니다.

이렇게하면 테이블 모양에 관계없이 매번 정답을 얻을 수 있습니다.