Найти количество с помощью сводных данных SQL Server

#sql #sql-server #count #pivot

#sql #sql-сервер #количество #сводные

Вопрос:

Я отображал данные о посещаемости за день с помощью сводного SQL.

 declare @startdate datetime = '2016-09-26' 
declare @enddate datetime = '2016-10-01'
declare @CompanyID int = 1

DECLARE @COLUMN VARCHAR(MAX), @SQL NVARCHAR(MAX);

SET @COLUMN = N'';

DECLARE @DATERANGE TABLE (DateToCheck DATE) 
;WITH Temp
AS
(
    SELECT DT =DATEADD(DD,0, @startdate)  
    WHERE DATEADD(DD, 1, @startdate) <= @enddate  
    UNION ALL  
    SELECT DATEADD(DD, 1, DT)  
    FROM Temp  
    WHERE DATEADD(DD, 1, DT) <= @enddate  
)

INSERT INTO @DATERANGE 
SELECT DT From Temp

SELECT @COLUMN  = N', T.'   QUOTENAME(DateRanges) FROM (SELECT CAST(CONVERT(DATE, T.DateToCheck) AS VARCHAR(10)) AS DateRanges FROM @DATERANGE T group by T.DateToCheck) AS A;

SET @SQL = '
DECLARE @DATERANGE TABLE (DateToCheck DATE) 
;WITH Temp
AS
(
    SELECT DT =DATEADD(DD,0, @startdate)  
    WHERE DATEADD(DD, 1, @startdate) <= @enddate  
    UNION ALL  
    SELECT DATEADD(DD, 1, DT)  
    FROM Temp  
    WHERE DATEADD(DD, 1, DT) <= @enddate  
)

INSERT INTO @DATERANGE 
SELECT DT From Temp

SELECT *
FROM (
    SELECT E.FirstName, E.LastName, E.Email, T.DateToCheck, COALESCE(A.val, L.val, H.val, ''Absent'') val
    FROM AspNetUsers E
    CROSS APPLY (
        SELECT DateToCheck FROM @DATERANGE
    ) T--(DateToCheck)
    LEFT JOIN (SELECT ''Holiday'' val, HolidayDate, CompanyID FROM Holidays) H ON H.HolidayDate = T.DateToCheck AND H.CompanyID = @CompanyID
    LEFT JOIN (SELECT ''In : ''   CONVERT(VARCHAR, MIN(AttendanceDateTime), 108)   '' / Out : ''   CONVERT(VARCHAR, MAX(AttendanceDateTime), 108)  val, CAST(AttendanceDateTime As DATE) As AttendanceDate, UserID FROM Attendances GROUP BY CAST(AttendanceDateTime As DATE), UserID) A ON A.AttendanceDate = T.DateToCheck AND A.UserID = E.Id
    LEFT JOIN (SELECT ''Leave'' val, LeaveDate, UserID FROM LeaveApplications) L ON L.LeaveDate = T.DateToCheck AND L.UserID = E.Id
    WHERE E.CompanyID = @CompanyID
    ) T
PIVOT (MAX(val) FOR DateToCheck IN ('   STUFF(REPLACE(@COLUMN, ', T.[', ',['), 1, 1, '')   ')) P';

EXEC sp_executesql @SQL, N'@startdate DATE, @enddate DATE, @CompanyID INT', @startdate, @enddate, @CompanyID
  

И ниже приведен результирующий набор того, как это сейчас

Набор результатов

Теперь я хочу добавить больше полей в приведенный выше SQL для отображения таких показателей, как PresentCount, AbsentCount, HolidayCount и LeaveCount

Я уже написал SQL, в котором я мог бы легко отобразить эти подсчеты, но я не могу заставить его работать с приведенным выше СВОДНЫМ SQL.

Таким образом, в этом случае результатом для первой строки будет PresentCount = 0, AbsentCount = 6, HolidayCount = 0 и LeaveCount = 0. Для строки 2 это будет PresentCount = 4, AbsentCount = 2, LeaveCount и HolidayCount оба равны 0.

Комментарии:

1. Может быть, вы могли бы объединить таблицу подсчетов со своей сводной таблицей?

2. @gofr1 Вы имеете в виду другое перекрестное соединение с теми же таблицами для выбора количества? Я попробую это.

3. Зачем перекрестное соединение? Он не может быть внутренним или присоединенным слева?

4. Да, я сделал это с помощью left join @gofr1. Спасибо за предложение 🙂 Я опубликую ответ здесь для дальнейшего использования, как только доберусь до дома 🙂