T SQL объединяет два запроса количества с немного отличающимся предложением where в один вывод - PullRequest
0 голосов
/ 13 марта 2020

Я хотел бы объединить два запроса T SQL, приведенных ниже, в один запрос.

  -------------------------------------
   USE [ourDB]
  -------------------------------------
  Select   --
 id
 , count(id) as count_30_days_or_less
  --
  FROM Col1 c1  WITH (NOLOCK)
  -- -- -- -- -- -- --
  LEFT JOIN Col2 c2  WITH (NOLOCK)  
  ON (c1.id = c2.foreign_id)
  -- -- -- -- -- -- --
  WHERE
  (
      (DATEDIFF( dd, cast(c1.ourDateTime as Date), cast(GETDATE() as Date)  ) <= 30)
  )
  GROUP BY id
  ORDER BY id
  -------------------------------------
  Select   --
 id
 , count(id) as count_45_days_or_less
  --
  FROM Col1 c1  WITH (NOLOCK)
  -- -- -- -- -- -- --
  LEFT JOIN Col2 c2  WITH (NOLOCK)  
  ON (c1.id = c2.foreign_id)
  -- -- -- -- -- -- --
  WHERE
  (
      (DATEDIFF( dd, cast(c1.ourDateTime as Date), cast(GETDATE() as Date)  ) <= 45)
  )
  GROUP BY id
  ORDER BY id
  -------------------------------------

Каждый первый запрос будет иметь формат id count_YY_days_or_less


цель состоит в том, чтобы вывести запрос в формате: id count_30_days_or_less count_45_days_or_less


Примечание: потенциально возможно, что в дополнение к различным значениям в столбце могут отображаться more экземпляры id для второго счета.

Принятый ответ правильный.

У меня есть «вторая часть»: Часть 2. Есть ли способ убедиться, что c1.id «различен» в количество возвратов из вышеприведенного запроса?

(См. комментарий принятого ответа для ответа «второй части»)

Это должно быть не зависит от версии, но я использую Microsoft SQL Server 2014 (SP3) ) (KB4022619) - 12,0,6024,0 (X64) 7 сентября 2018 года 01:37:51

1 Ответ

3 голосов
/ 13 марта 2020

Вы можете выполнить условное агрегирование:

select 
    id,
    sum(case when c1.ourdatetime >= dateadd(day, -30, cast(getdate() as date)) then 1 else 0 end) count_30_days_or_less,
    count(*) as count_45_days_or_less
from col1 c1
left join col2 c2  on c1.id = c2.foreign_id
where c1.ourdatetime >= dateadd(day, -45, cast(getdate() as date))
group by id
order by id

Фильтры запросов по данным за последние 45 дней (обратите внимание, что я упростил ваш код, чтобы не использовать функции даты в столбце таблицы - это более эффективно) , Затем мы используем условное выражение для подсчета количества строк на id только в течение 30 дней.

...