Запрос SQL SERVER COUNT

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

ДИАГРАММА ERD для базы данных находится по адресу SQL Server, эквивалентный 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)

person Usman Shafi Arain    schedule 11.03.2015    source источник
comment
MySQL и / или SQL Server? (Не помечайте не задействованные продукты ...)   -  person jarlh    schedule 12.03.2015


Ответы (1)


Не уверен на 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`
person Alex    schedule 11.03.2015
comment
Алекс, я получаю двойные значения имен. Они должны появиться один раз - person Usman Shafi Arain; 11.03.2015
comment
Я добавил ваш результат и запрос. Пожалуйста, проверьте спасибо - person Usman Shafi Arain; 11.03.2015
comment
@UsmanShafiArain У тебя только Group By `Employee Name`? вы уверены? - person Alex; 12.03.2015