Как выбрать постоянное значение, если рассматриваемое значение не найдено?

#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);
        }