Сложный SQL-запрос - поиск набора чего-либо, его подсчет, затем нахождение подмножества первого набора и подсчет этого - PullRequest
2 голосов
/ 03 июля 2010

У меня есть три таблицы, мы будем называть их table1, table2 и table3.Допустим, в каждой таблице есть столбец идентификатора пользователя и столбец даты.Я хотел бы подсчитать количество строк с определенным идентификатором пользователя в таблице 1 и сложить его с количеством строк с этим идентификатором пользователя в таблицах 2 и 3.

IЗатем я хотел бы взять тот первый запрос, который я сделал, который имеет все строки с идентификатором пользователя, а затем вынуть и посчитать те, в которых столбец даты больше определенной даты (время Unix).

Все, что я хотел бы получить в конце, это две вещи.Количество строк в таблицах 1, 2 и 3, в которых есть идентификатор пользователя, который я искал, суммируется вместе, и количество строк в таблицах 1, 2 и 3, которые имеют идентификатор пользователя, который я искал, а также после определенногодата суммируется вместе.

Какой самый эффективный способ сделать это?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 03 июля 2010
SELECT 
    COUNT(*) AS TotalPets, 
    SUM(CASE WHEN date > somedate THEN 1 ELSE 0 END) AS TotalPetsAfterDate
FROM
(
SELECT date FROM dogs WHERE UserId = 9
UNION ALL
SELECT date FROM cats WHERE UserId = 9
UNION ALL
SELECT date FROM ferrets WHERE UserId = 9
) Pets

Или альтернатива, которая может сделать Имре счастливее.

SELECT 
    SUM(PetsSubTotal) AS TotalPets, 
    SUM(PetsAfterDateSubTotal) AS TotalPetsAfterDate
FROM
(
SELECT COUNT(*) AS PetsSubTotal,  SUM(CASE WHEN date > somedate THEN 1 ELSE 0 END) AS PetsAfterDateSubTotal
FROM dogs 
WHERE UserId = 9
UNION ALL
SELECT COUNT(*) AS PetsSubTotal,  SUM(CASE WHEN date > somedate THEN 1 ELSE 0 END) AS PetsAfterDateSubTotal
FROM cats 
WHERE UserId = 9
UNION ALL
SELECT COUNT(*) AS PetsSubTotal,  SUM(CASE WHEN date > somedate THEN 1 ELSE 0 END) AS PetsAfterDateSubTotal
FROM ferrets 
WHERE UserId = 9
) SubTotals
0 голосов
/ 03 июля 2010

В качестве альтернативы другому ответу (который мне тоже нравится) и при условии, что у вас есть таблица идентификаторов пользователей:

Select 
  CustID, Count(Pet_ID) as Total, Sum(In_Range) as AfterDate
From
  (Select
    CustID, Pet_ID, Case When PurDate > somedate Then 1 else 0 End as In_Range
  From
    Users
  Inner Join
    Pets
      on Users.CustId = Pets.CustId
  Where
    CustId = 9) D
Group By
  CustID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...