Условный возврат SQL - PullRequest
       45

Условный возврат SQL

0 голосов
/ 02 сентября 2018

Мне не удалось найти условие WHERE или HAVING, которое помогает мне вернуть следующее:

Если пользователь зарегистрировал активность за последний месяц, я хочу вернуть записи за последние шесть (6) месяцев для этих пользователей. До сих пор я использовал следующий запрос ...

SELECT
    USER, 
    CAST(ACTIVITY AS DATE), 
    COUNT(DISTINCT ACTIONS), 
    SUM(RESULTS)
FROM
    TABLE
WHERE 
    ACTIVITY >= DATEADD(MONTH, -6, GETDATE())
GROUP BY 
    [conditions]
ORDER BY 
    [conditions]

Я пытался использовать

HAVING 
    (COUNT(USER) * CAST(DATEADD(MONTH, -1, GETDATE()) AS DECIMAL)) > 0

но я получаю отчеты о возвратах от неактивных пользователей, которые зарегистрировали действие только в течение последних шести (6) месяцев, а не текущего или самого последнего месяца.

Помощь? !!

Заранее спасибо,

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Из моего понимания

create table #date ( id int, logdate date)

insert #date values
  (1,'2018-08-03')  -- last month
, (1,'2018-05-03')  -- before 4 month
, (1,'2018-03-03')  -- before 6 month
, (1,'2018-02-03')  -- before 7 month
, (2,'2018-09-03')  -- logged on this month
, (2,'2018-05-03')  -- before 4 month
, (3,'2018-07-03')  -- before 2 month


select *, 'Who logged on before 6 months from last month'
from #date
WHERE DATEPART(m, logdate) <= DATEPART(m, DATEADD(m, -1, getdate()))                        -- logged date on last month
and DATEPART(m, logdate) >= DATEPART(m, DATEADD(m, -6, getdate()))                          -- logged date on before 6 months
and id in (                                                                                 -- 
 select id from #Date where DATEPART(m, logdate) = DATEPART(m, DATEADD(m, -1, getdate()))   -- 
)                                                                                           -- Ids who Logged in past month

/*      User 1, who logged on past month. So query gets his past 6 (3,4,5,6,7,8) month's logged date                    */

Верните меня, если запрос потребует обновления.

0 голосов
/ 02 сентября 2018

Вы можете использовать оператор exists с подзапросом для пользователей с активностью за последний месяц:

SELECT
    USER, 
    CAST(ACTIVITY AS DATE), 
    COUNT(DISTINCT ACTIONS), 
    SUM(RESULTS)
FROM
    TABLE a
WHERE 
    ACTIVITY >= DATEADD(MONTH, -6, GETDATE()) AND 
    EXISTS (SELECT *
            FROM   TABLE b
            WHERE  a.USER = b.USER AND
                   ACTIVITY >= DATEADD(MONTH, -1, GETDATE()))
GROUP BY 
    USER
ORDER BY 
    [conditions]
...