2017-02-13 3 views
0

Для администратора я выполняю определенный тип операции sql. Записи имеют следующий тип.Как отобразить за последние 5 дней записи аудита в DB2 через SQL-суточный день и показать количество их в день в одной строке

date  number of failed login 
13/02/2017   1 
12/02/2017   2 
11/02/2017   0 
10/02/2017   9 
09/02/2017   0 

Я хочу 0,9,0,2,1 в одном ряду.

Я пробовал нижеследующий запрос. Но не удалось получить нуль по умолчанию. В какой день пользователя должен выполняться нулевая операция.

select LISTAGG(cnt, ', ') 
from (select count(*) as cnt 
     from OPERATIONINFO 
     where OPERATIONTYPE='FAILEDLOGIN' 
     and CUSTID = 123 
     and date(UPDATEDDATEOFLOGIN) > (current date - 5 day) 
     group by YEAR(date), MONTH(date), DAY(date) 

Просьба помочь.

+0

Я отформатировал ваш код так, чтобы он был читабельным, и ясно, что вам не хватает ')' - куда он идет? Перед группой? – Hogan

+0

спасибо..неся группа, я пропустил скобку .. – patnaix

ответ

0

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

INSERT INTO Sales VALUES 
(2004, 1, 20), 
(2004, 2, 30), 
(2004, 3, 15), 
(2004, 4, 10), 
(2005, 1, 18), 
(2005, 2, 40), 
(2005, 3, 12), 
(2005, 4, 27); 

этой

Year Q1 Q2 Q3 Q4 
---- -- -- -- -- 
2004 20 30 15 10 
2005 18 40 12 27 

by using decode in db2

SELECT Year, 
     MAX(DECODE(Quarter, 1, Results)) AS Q1, 
     MAX(DECODE(Quarter, 2, Results)) AS Q2,    
     MAX(DECODE(Quarter, 3, Results)) AS Q3, 
     MAX(DECODE(Quarter, 4, Results)) AS Q4 
    FROM Sales 
    GROUP BY Year; 
+0

Я хочу нуль по умолчанию. Это позволяет получить запись только в том случае, если пользователь выполнил какую-либо операцию. – patnaix

0

Вам нужен стол даты ... здесь я делаю на на лету с помощью рекурсии - не лучший способ ...

WITH DATES_TABLE AS 
(
    SELECT CURRENT DATE - 5 DAYS AS D FROM SYSIBM.SYSDUMMY1 

    UNION ALL 

    SELECT D + 1 DAY AS D FROM DATES_TABLE WHERE D < CURRENT DATE 
), THE_DATA AS 
(
    select D.D, SUM(CASE WHEN O.UPDATEDDATEOFLOGIN IS NOT NULL THEN 1 ELSE 0 END) as cnt 
    from DATES_TABLE D 
    LEFT JOIN OPERATIONINFO O ON O.UPDATEDDATEOFLOGIN = D.D 
    where O.OPERATIONTYPE='FAILEDLOGIN' 
    and O.CUSTID = 123 
    group by D.D 

) 
select LISTAGG(cnt, ', ') 
from THE_DATA 
Смежные вопросы