2012-02-04 3 views
0

У меня есть запрос следующим образом:Как я могу преобразовать этот SQL в HQL запрос

WITH CTE AS (
    SELECT MIN(att.Date) [minDate] 
    FROM Attendance att 
    WHERE att.Date between '12/01/2011 00:00:00' 
    AND '12/31/2011 00:00:00' 
    AND att.EmpID = 4700 
    GROUP BY EmpID, CONVERT(VARCHAR, att.Date , 111) 
    HAVING MIN(CONVERT(VARCHAR, att.Date , 8)) > '09:00:00') 
SELECT COUNT(minDate) FROM CTE 

мне нужно использовать его в C# приложение, но я не могу просто использовать запрос, как он говорит, что в запросе должен начинаться с ключевого слова select или from. Мне нужен этот запрос для работы в HQL. Пожалуйста помоги.

ответ

1

, наконец, он работал с этими

SELECT count(att.AttDate) 
from Attendance att 
where att.Employee.EmployeeCD = "+ empCD +" 
and att.AttDate IN 
    (SELECT MIN(att.AttDate) 
    from Attendance att 
    where att.AttDate between '" + startDate.Date + "' and '" + endDate.Date + "' 
    and att.Employee.EmployeeCD = " + empCD + " 
    GROUP BY EmployeeCD, CONVERT(VARCHAR,att.AttDate, 111) 
    having min(CONVERT(VARCHAR, att.AttDate, 8)) > '08:10:00') 
1

Вы должны переписать запрос.

В результате мы не заботимся о дате вообще, какой интерес у нас общий результат, поэтому мы можем удалить дату из выбора и заменить ее на EmpId *.

SELECT EmpID 
    FROM Attendance att 
    WHERE att.Date between '12/01/2011 00:00:00' 
    AND '12/31/2011 00:00:00' 
    AND att.EmpID = 4700 
    GROUP BY EmpID, CONVERT(VARCHAR, att.Date , 111) 
    HAVING MIN(CONVERT(VARCHAR, att.Date , 8)) > '09:00:00') 

Нет, мы можем изменить вопрос на что-то вроде этого.

SELECT COUNT(EmpID) FROM Attendance WHERE EmpID IN (
    SELECT EmpID 
     FROM Attendance att 
     WHERE att.Date between '12/01/2011 00:00:00' 
     AND '12/31/2011 00:00:00' 
     AND att.EmpID = 4700 
     GROUP BY EmpID, CONVERT(VARCHAR, att.Date , 111) 
     HAVING MIN(CONVERT(VARCHAR, att.Date , 8)) > '09:00:00') 
); 

Этот второй запрос перефразирует только выражение CTE, которое в большинстве случаев является только синтаксическим сахаром. Преобразование этого в HQL не должно быть проблемой.

* Я предполагаю, что EmpID уникален.

+0

да, EmpId является Uniq. и большое спасибо за помощь. но результат запроса идет со всеми строками этого empID независимо от любого условия. Мне просто нужно подсчитать строки, которые появляются в вашем первом запросе. PLZ помощь. – Almaji

+0

Первое, вероятно, это, но второе вернет счет. Но для примера, которому вы дали результат, будет значение null или 1. Поэтому, если запрос, в котором выполняется условие, вам действительно не нужен этот счет. –

+0

Позвольте мне уточнить. У emp 4700 есть 500 дней посещения в его трудовой жизни. в соответствии со всеми условиями, второй результат запроса предполагает возврат количества посещений между 12/1 по 12/31. так что, полагаю, вернемся в лучшем случае менее 31 раз? но результат запроса - 500. Его общая посещаемость. что теперь? – Almaji

Смежные вопросы