2015-03-11 5 views
0

Я пытаюсь выполнить назначение, но я получаю двойные значения. Я выбираю апрельский месяц в качестве стандартного для вычисления оставшихся дней и принятых дней. Для праздников Фильтрации BenefitTypeID равен 1. Пожалуйста, помогите мне. Вот вопрос и запрос, который я написал:SQL SERVER COUNT Query

ERD ДИАГРАММА для базы данных на SQL Server equivalent to GROUP_CONCAT()

1.Number of benefits days allotted to each employee 
2.Number of benefit days taken year-to-date 
3.Number of benefit days remaining in the calendar year 
4.Number of holidays allotted to each employee 
5.Number of holidays taken year-to-date 
6.Number of holidays remaining in the calendar year 

Для этого задания, написать запрос, который производит результаты, описанные выше. Предположим, что вы запускаете отчет за 2013 календарный год. Как и в предыдущем отчете, в реальном мире вы, скорее всего, используете функцию getdate() для определения текущей даты и запуска отчета с начала текущего года и до настоящего времени. Однако для этого задания вы можете запрограммировать 2013 год в своем запросе и получить все данные за этот год.

SELECT 
    E.LastName+ ' '+E.FirstName As [Employee Name], 
    count (B.BenefitTypeID)as [No of Benefit Days], 
    SUM(CASE WHEN BT.BenefitTypeID='1' THEN 1 ELSE 0 END) As [Number of Holidays], 
    SUM(CASE WHEN B.BT_Month='4' AND B.BT_Year='2013' THEN 1 ELSE 0 END) As [Number of Days Taken], 
    SUM(CASE WHEN B.BT_Month!='4' and B.BT_Year!='2013' THEN 1 ELSE 0 END) As [Number of Days Remaining], 
    SUM(CASE WHEN BT.BenefitTypeID='1' and B.BT_Month='4' and B.BT_Year='2013' THEN 1 ELSE 0 END) As [Number of Holidays Taken], 
    SUM(CASE WHEN BT.BenefitTypeID='1' and B.BT_Month!='4' and B.BT_Year!='2013' THEN 1 ELSE 0 END) As [Number of Holidays Remaining] 

FROM BenefitsTaken B 
JOIN Employees E 
ON(B.EmpID = E.EmpID) 

LEFT Join BenefitTypes BT 
ON(B.BenefitTypeID=BT.BenefitTypeID) 

Group By E.LastName,E.FirstName,BT.BenefitTypeID,B.BT_Month,B.BT_Year 

Это результаты запроса. Имена сотрудников должны появляться один раз, спасибо

Employee Name             No of Benefit Days Number of Holidays Number of Days Taken Number of Days Remaining Number of Holidays Taken Number of Holidays Remaining 
------------------------------------------------------------- ------------------ ------------------ -------------------- ------------------------ ------------------------ ---------------------------- 
Doe James              1     0     1     0      0      0 
Doe James              1     0     0     0      0      0 
Jones Mark             2     2     0     0      0      0 
Jones Mark             1     0     1     0      0      0 
Jones Mark             1     0     0     0      0      0 
Rice Luke              1     0     1     0      0      0 
Rice Luke              1     0     0     0      0      0 
Smith Matthew             1     1     1     0      1      0 
Smith Matthew             1     0     1     0      0      0 

(9 row(s) affected) 
+0

MySQL и/или SQL Server? (Не помещайте те продукты, которые не задействованы ...) – jarlh

ответ

0

Не 100% уверен, но в два раза может быть вызвано двумя группами LastName, FirstName поэтому попробуйте использовать group By [Employee Name]:

SELECT 
    E.LastName+ ' '+E.FirstName As [Employee Name], 
    count (B.BenefitTypeID)as [No of Benefit Days], 
    SUM(CASE WHEN BT.BenefitTypeID='1' THEN 1 ELSE 0 END) As [Number of Holidays], 
    SUM(CASE WHEN B.BT_Month='4' AND B.BT_Year='2013' THEN 1 ELSE 0 END) As [Number of Days Taken], 
    SUM(CASE WHEN B.BT_Month!='4' and B.BT_Year!='2013' THEN 1 ELSE 0 END) As [Number of Days Remaining], 
    SUM(CASE WHEN BT.BenefitTypeID='1' and B.BT_Month='4' and B.BT_Year='2013' THEN 1 ELSE 0 END) As [Number of Holidays Taken], 
    SUM(CASE WHEN BT.BenefitTypeID='1' and B.BT_Month!='4' and B.BT_Year!='2013' THEN 1 ELSE 0 END) As [Number of Holidays Remaining] 

FROM BenefitsTaken B 
JOIN Employees E 
ON(B.EmpID = E.EmpID) 

LEFT Join BenefitTypes BT 
ON(B.BenefitTypeID=BT.BenefitTypeID) 

Group By `Employee Name` 
+0

Alex Я получаю двойные значения имен. Они должны появиться после –

+0

. Я добавил ваш результат и запрос. Пожалуйста, подтвердите благодарность –

+0

@UsmanShafiArain У вас есть только 'Group By \' Employee Name \ ''? ты уверен? – Alex