sql рассчитывать на оператор объединения и объединения - PullRequest
0 голосов
/ 05 июня 2019

У меня есть следующие таблицы (city1, city2, city3 (и т. Д.) И пользователи)

таблица city1

id   userid   notes                    noteAdded
1    55       this is a test           2019-03-18 14:40:05.227
2    56       another test             2019-04-18 14:40:05.227
3    55       third test               2019-04-16 14:40:05.227

таблица city2

id    userid    notes                    noteAdded
1     55        this is city2 notes      2019-04-18 14:40:05.227
2     57        this is another note     2019-04-17 14:40:05.227

city3 table

id    userid    notes    noteAdded
........

users table

id     username
55     bob smith
56     james brown
57     scott bean

Я пытаюсь добиться следующего, упорядоченного по времени отправки desc

id    userid   username     noteadded            count
1     55       bob smith    04-18-fulldatehere   3
2     56       james brown  04-18...             1
3     57       scott bean   04-17...             1
4     55       bob smith    04-16...             3

У меня есть следующее

select userid, noteadded, username
from (
  SELECT userid, noteadded, u.username
  FROM city1 cone
  left join users on cone.userid = u.id 

  union

  SELECT userid, noteadded, u.username
  FROM city2 ctwo
  left join users u on ctwo.userid = u.id
)
as rr
order by noteadded desc;

Это работает, но как только я добавляю COUNT(userid) перед этой подкомандой (оператор выбора между круглыми скобками), я получаю ошибки, указывающие rr.userid недействительно.Если я уберу отсчет, заявление сработает.Единственная причина, по которой я добавил часть as rr, заключается в том, что без этого я не мог бы вкладывать подзапрос, т. Е. Я не мог сделать это:

select userid, noteadded, username
from (
  SELECT userid, noteadded, u.username
  FROM city1 cone
  left join users on cone.userid = u.id 

  union

  SELECT userid, noteadded, u.username
  FROM city2 ctwo
  left join users u on ctwo.userid = u.id
)
order by noteadded desc;

Моя цель для оператора sql - измерить, насколько активнымпользователь - таким образом, количество.В конце концов я планирую ограничить результаты и / или рассчитывать по дате.Скажем, покажи только вещи за последние 30 дней.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Если вы хотите посчитать, что является функцией агрегирования, то вам также нужно group by, и для каждого столбца, который вы хотите отобразить, вы должны либо агрегировать его, либо group by это.

declare @City1 table (id int, userid int, notes varchar(128), noteAdded datetime);
declare @City2 table (id int, userid int, notes varchar(128), noteAdded datetime);
declare @User table (id int, username varchar(64));

insert into @City1 (id, userid, notes, noteAdded)
  select 1,    55,       'this is a test',           '2019-03-18 14:40:05.227' union all
  select 2,    56,       'another test',             '2019-04-18 14:40:05.227' union all
  select 3,    55,       'third test',               '2019-04-16 14:40:05.227';

insert into @City2 (id, userid, notes, noteAdded)
  select 1,    55,       'this is city2 notes',           '2019-04-18 14:40:05.227' union all
  select 2,    57,       'this is another note',          '2019-04-17 14:40:05.227';

insert into @User (id, username)
  select 55,     'bob smith' union all
  select 56,     'james brown' union all
  select 57,     'scott bean'

select userid
  , username
  , max(noteadded) noteadded /* Has to be an aggregate since we're grouping */
  , count(userid) [count]
from (
  SELECT userid, noteadded, u.username
  FROM @city1 cone
  left join @user u on cone.userid = u.id 

  union all

  SELECT userid, noteadded, u.username
  FROM @city2 ctwo
  left join @user u on ctwo.userid = u.id
)
as rr
group by UserId, username;
--order by noteadded desc; -- Can't order by a column being aggregated

PS: если я могу побудить вас опубликовать все вопросы в этом формате, то есть создавать временные таблицы или переменные таблиц, вставлять данные и пытаться выполнить запрос. Это облегчает людям ответ на намного и будет стимулировать более быстрые ответы.

0 голосов
/ 05 июня 2019

Если я правильно понимаю, вы можете union таблицы "city" вместе, а затем сделать join:

select u.id, u.username, count(*), max(noteadded)
from users u left join
     (select c.*
      from ((select c.* from city1) union all
            (select c.* from city2) union all
            (select c.* from city3) 
           ) c
     ) c
     on c.userid = u.id
group by u.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...