Member 13264296 Ответов: 1

Как я могу манипулировать сводными данными и вставлять недостающие даты?


Поскольку мы знаем, что запись будет сохранена в базе данных, если есть транзакция на эту дату. Но если есть определенная дата, когда у нас не было транзакций, то никакая дата транзакций не будет занесена в базу данных. Теперь я сделаю отчет, мне нужно отобразить даты, включая отсутствие транзакций. Включая субботу и воскресенье. Я использовал метод pivot для своего sql-запроса.

Что я уже пробовал:

SELECT *
FROM (
    SELECT 
       A.employee_id,B.firstname, B.branch_code , A.trans_date as [Date],A.bioinoutmode as [Type], 
        A.trans_time as Time 
    FROM biometricdata A
LEFT JOIN Employees B ON A.employee_id = B.employee_id
WHERE A.employee_id = B.employee_id
) as s
PIVOT
(
    MAX(Time)
    FOR [Type] IN ([0],[1],[2],[3],[4],[5])
)AS pvt Order by DATE

1 Ответов

Рейтинг:
1

CHill60

Обычно я делаю это, генерируя список дат, которые мне нужны (см. Генерация последовательности в SQL[^]), а затем использовать эту таблицу в левом соединении с моей фактической таблицей данных.
Напр.

SELECT ....-- column list
FROM MyListOfDates D
LEFT OUTER JOIN biometricdata A ON D.DesiredDate = A.[DATE] -- or whatever your column is
LEFT OUTER JOIN Employees B ON A.employee_id = B.employee_id

Просто не забудьте обработать результирующие нули, возвращенные из A &B для пустых дат


Member 13264296

Здесь у меня был другой код. Но даты пропажи не отображаются..

Объявить @startdate DATETIME
,@enddate DATETIME;

Набор 11/18/2017 @даты начала StartDate ='';
SET @enddate = '25.11.2017';
С календарями
AS ( SELECT date = @startdate
СОЮЗ ВСЕХ
Выберите DATEADD(день, 1, Дата)
Из календарей
Где DATEADD(день, 1, Дата) <= @enddate
)
Выберите конвертировать(VARCHAR(15), c.date, 101) в качестве logdate
,t.employee_id
,Преобразовать(VARCHAR(10), t.trans_time, 108) в timein
От dbo.biometricdata t
Правое соединение calendardates c
На t.trans_date = c.date, где t.employee_id = '7263'

CHill60

Вы должны использовать

FROM calendardates c
LEFT OUTER JOIN dbo.biometricdata t ON t.trans_date = c.date
.
Воспользуйся ЛЕВЫЙ НАРУЖНЫЙ когда вы не хотите, чтобы данные слева "выходили"!