#sql #sql-server #entity-framework #group-by
#sql #sql-сервер #entity-framework #группировка по
Вопрос:
Прежде всего, я прошу прощения за плохое название, которое я выбрал для этого вопроса. 🙂
В моей базе данных у меня есть таблицы Employee и Comment, как вы видели ниже. Каждый сотрудник может сохранять свои действия в таблице комментариев, а менеджер может видеть отчет о действиях сотрудников.
Я использую этот запрос для выбора активности сотрудников за каждый месяц в конкретном году.
SELECT Month ,
ISNULL(( SELECT ( FirstName '' LastName )
FROM dbo.Employee
WHERE EmployeeID = C.EmployeeID
), '') [Name] ,
ISNULL(COUNT(EmployeeID), 0) [Count]
FROM dbo.Comment AS C
WHERE Year = 1393
GROUP BY Month ,
EmployeeID
ORDER BY C.EmployeeID
и результат:
но я хочу сделать это, если у каждого из сотрудников нет какой-либо активности в каждом месяце, затем выберите строку like Month|Name|0
для этого месяца и сотрудника.
Как я могу это сделать?
Обновление Я изменил запрос на это:
DECLARE @aa TABLE ( m INT )
DECLARE @c INT= 1
WHILE @c < 13
BEGIN
INSERT INTO @aa
( m )
VALUES ( @c -- m - int
)
SET @c = @c 1
END
SELECT m ,
( SELECT ( FirstName ' ' LastName )
FROM dbo.Employee
WHERE EmployeeID = C.EmployeeID
) [Name] ,
COUNT(CommentID) [Count]
FROM dbo.Comment AS C
RIGHT JOIN @aa ON m = Month
GROUP BY m ,
EmployeeID
ORDER BY m
и тогда результат таков:
но я хочу получить этот результат:
Комментарии:
1. ПРАВОЕ СОЕДИНЕНИЕ с таблицей календаря, по сути, 12 целых чисел.
2. Как я могу сделать это в EntityFramework ?
Ответ №1:
Ниже приведен один из методов, использующий CTE и ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ для получения всех комбинаций сотрудник / месяц.
WITH
employees AS (
SELECT
EmployeeID
, FirstName '' LastName AS Name
FROM dbo.Employee
)
,months AS (
SELECT month FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(8),(10),(11),(12)) AS months(Month)
)
SELECT
m.Month
,e.Name
,(SELECT COUNT(*)
FROM dbo.Comment AS c
WHERE
c.EmployeeID = e.EmployeeID
AND c.Month = m.Month
AND c.Year = 1393
) AS Count
FROM months AS m
CROSS JOIN employees AS e
ORDER BY
Month
,Name;
Комментарии:
1. Как я могу это сделать с помощью запросов linq ? Возможно ли это?
Ответ №2:
Вам нужно создать таблицу с именем Месяцы и вставить в нее данные от 1 до 12. Затем в entityframework вы можете создать следующий запрос, чтобы получить данные из таблицы комментариев, сотрудников и месяцев:
var q = from m in stackExchangeExampleEntities.Months
from e in stackExchangeExampleEntities.Employees
select new
{
EmployeeName = e.FirstName,
Month = m.Id,
Count = (from c in stackExchangeExampleEntities.Comments
where c.EmployeeId ==e.EmployeeId amp;amp; c.Month == m.Id amp;amp; c.Year == 1393
select c).Count()
};
foreach (var data in q)
{
Console.WriteLine(data.Month "," data.EmployeeName "," data.Count);
}