Счетчик SQL для нескольких объединений с динамическим WHERE - PullRequest
1 голос
/ 30 ноября 2010

Моя проблема в том, что у меня есть оператор Select, который имеет предложение where, которое генерируется на лету.Это объединено через 5 таблиц.

Мне в основном нужен счетчик каждого экземпляра DISTINCT идентификатора пользователя в таблице 1, который входит в область действия WHERE.Это также должно быть выполнено в одном операторе.Так что, по сути, я не могу сделать глобальный GROUP BY из-за данных из 4 других таблиц, которые мне нужно вернуть.

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

SELECT  * 
FROM    TBL1 1  
        INNER JOIN TBL2 2 On 2.FK = 1.FK
        INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
        LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE   1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00'
ORDER BY 
        4.Column
        , 3.Column
        , 3.Column2
        , 1.Date_Time_In DESC

Так что вместо выбора всех столбцов я буду фильтровать его примерно до 5 или 6, но с этим мне нужно что-то вроде Totalстолбец, который является отличительным счетчиком первичного ключа TBL1, в котором применяется предложение WHERE, которое может увеличиваться или уменьшаться в размере.

Я почти хотел бы, чтобы был способ применить то же предложение WHERE к подвыборке, потому что я понимаю, что это сработает, но не знаю другого способа, кроме создания переменной и просто размещения ее в обоих местах, которыетоже не могу.

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать одну из функций AGGREGATE OVER .

SELECT  *
        , COUNT(UserID) OVER(PARTITION BY UserID) AS 'Total'
FROM    TBL1 1  
        INNER JOIN TBL2 2 On 2.FK = 1.FK
        INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
        LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE   1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00'
ORDER BY 
        4.Column, 3.Column, 3.Column2, 1.Date_Time_In DESC
0 голосов
/ 30 ноября 2010

что-то вроде добавления:

inner join (select pk, count(distinct user_id) from tbl1 WHERE Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00') as tbl1too on 1.PK = tbl1too.PK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...