Использование подзапроса в списке столбцов - PullRequest
4 голосов
/ 17 мая 2011

Я хотел бы создать запрос, который бы подсчитывал, сколько записей было создано за последние 7, 14 и 28 дней.Мой результат будет выглядеть примерно так:

7Days  14Days  28Days  
21     35      56

Я знаю, как для каждого timepsan, например, 7 дней, но я собираю все три в одном запросе?

select count(*) from Mytable
where Created > DATEADD(day,-8, getdate()) 

Ответы [ 4 ]

4 голосов
/ 17 мая 2011

Тоже не красиво, но не зависит от подзапросов (имена таблиц / столбцов взяты из AdventureWorks).Оператор case возвращает 1, если он попадает в ваши критерии, 0 в противном случае - тогда вы просто суммируете результаты:

select sum(case when datediff(day, modifieddate, getdate()) <= 7
                then 1 else 0 end) as '7days',
       sum(case when datediff(day, modifieddate, getdate()) > 7
                     and datediff(day, modifieddate, getdate()) <= 14
                then 1 else 0 end) as '14days',
       sum(case when datediff(day, modifieddate, getdate()) > 14
                     and datediff(day, modifieddate, getdate()) <= 28
                then 1 else 0 end) as '28days'
from sales.salesorderdetail

Редактировать: Обновлена ​​функция datediff - способ ее написания,он будет возвращать отрицательное число (при условии, что измененная дата была в прошлом), в результате чего все элементы попадают под первый случай.Спасибо Андрею М за указание на это

0 голосов
/ 18 мая 2011
SELECT
  [7Days]  = COUNT(CASE UtmostRange WHEN  7 THEN 1 END),
  [14Days] = COUNT(CASE UtmostRange WHEN 14 THEN 1 END),
  [28Days] = COUNT(CASE UtmostRange WHEN 28 THEN 1 END)
FROM (
  SELECT
    *,
    UtmostRange = CASE
      WHEN Created > DATEADD(day,  -8, GETDATE()) THEN  7
      WHEN Created > DATEADD(day, -15, GETDATE()) THEN 14
      WHEN Created > DATEADD(day, -29, GETDATE()) THEN 28
    END
  FROM Mytable
) s
0 голосов
/ 17 мая 2011
select
(
  select count(*)
  from Mytable
  where Created > DATEADD(day,-8, getdate())
) as [7Days],
(
  select count(*)
  from Mytable
  where Created > DATEADD(day,-15, getdate())
) as [14Days], 
(
  select count(*)
  from Mytable
  where Created > DATEADD(day,-29, getdate())
) as [28Days] 
0 голосов
/ 17 мая 2011

Это не самый красивый код в мире, но он делает свое дело.Попробуйте выбрать один из трех подзапросов, по одному для каждого диапазона.

select * from 
(select COUNT(*) as Cnt from    Log_UrlRewrites where CreateDate >= DATEADD(day, -7, getdate())) as Seven
inner join (select  COUNT(*) as Cnt from    Log_UrlRewrites where CreateDate >= DATEADD(day, -14, getdate())) as fourteen on 1 = 1
inner join (select  COUNT(*) as Cnt from    Log_UrlRewrites where CreateDate >= DATEADD(day, -28, getdate())) as twentyeight on 1 = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...