Мне нужно отбросить дни месяца и сделать дубликаты месяцев отличными - PullRequest
0 голосов
/ 12 октября 2010
SELECT  e.firstName,t.setDate, w.wageAmount
         FROM TimeSheet t
         INNER JOIN Employee e
         ON e.employeeID = t.employeeID
         INNER JOIN Salary s
         ON s.salaryID = t.salaryID
         INNER JOIN Wage w
         ON w.wageID = s.wageID
         INNER JOIN EmpHiringInfo ehf
         ON ehf.EmpHiringInfoID = s.EmpHiringInfoID
         INNER JOIN WageType wt
         ON wt.wageTypeID = w.wageTypeID
         WHERE (wt.wageTypeID = 19) AND (ehf.isActive = 1 AND s.isActive = 1
         AND ehf.employeeID = 300) AND (CONVERT(varchar, t.setDate, 23) BETWEEN '2000-08-02' AND '2020-08-04')

Кстати, зарплата только одна на каждый месяц, поэтому зарплата повторяется.Таким образом, за месяц 11,2010 заработной платы составляет 3600 независимо от того, сколько дней в 11,2010 ...

В приведенном выше примере получается следующий пример кода:

alt text

Мне нужно собрать все аналогичные месяц / год в одну ячейку, отбрасывая дни и время.Например, 2010-11-12 и 2010-11-26 должны быть заключены в одну ячейку как 2010-11 (в любом формате).

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Чтобы объединить все даты в месяцы, вы можете сделать что-то вроде этого:

dateadd(mm,datediff(mm,0,t.setDate),0)

Но вам нужно сгруппировать это, если вы хотите сделать агрегации:

select e.firstName,dateadd(mm,datediff(mm,0,t.setDate),0), sum(w.wageAmount)
from ...
group by e.firstName, dateadd(mm,datediff(mm,0,t.setDate),0)
0 голосов
/ 12 октября 2010

В T-SQL есть функция DatePart , которая может извлечь дату и год определенной даты.

Ваш запрос может выглядеть примерно так:

SELECT  e.firstName, 
DATEPART(yy, t.setDate) AS Year, 
DATEPART(mm, t.setDate) AS Month, 
MAX(w.wageAmount) AS wageAmount
FROM TimeSheet t
     INNER JOIN Employee e
     ON e.employeeID = t.employeeID
     INNER JOIN Salary s
     ON s.salaryID = t.salaryID
     INNER JOIN Wage w
     ON w.wageID = s.wageID
     INNER JOIN EmpHiringInfo ehf
     ON ehf.EmpHiringInfoID = s.EmpHiringInfoID
     INNER JOIN WageType wt
     ON wt.wageTypeID = w.wageTypeID
     WHERE (wt.wageTypeID = 19) AND (ehf.isActive = 1 AND s.isActive = 1
     AND ehf.employeeID = 300) AND 
     (CONVERT(varchar, t.setDate, 23) BETWEEN '2000-08-02' AND '2020-08-04')
GROUP BY e.firstName, DATEPART(yy, t.setDate), DATEPART(mm, t.setDate)
0 голосов
/ 12 октября 2010

Вы можете попробовать что-то вроде следующего:

SELECT  e.firstName
,CONVERT(CHAR(7),t.setDate,102)
,SUM(w.wageAmount)
FROM ...

GROUP BY e.firstName, 
,CONVERT(CHAR(7),t.setDate,102)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...