2010-05-26 4 views
0

Мое приложение выполняет ряд запросов с общей формой:Получить количество записей отсканированных в совокупности запросов

SELECT <aggregate-functions> 
FROM <table-name> 
WHERE <where-clause> 
GROUP BY <group-by column list> 

Я хотел бы знать, сколько записей способствовали совокупного набора результатов (другими словами, как многие записи соответствовали условиям в предложении WHERE), что-то скрыто из-за как агрегатных функций в предложении SELECT, так и предложения GROUP-BY. Я знаю, что я мог бы сделать простой SELECT COUNT (*), используя то же предложение WHERE, чтобы получить это число, но я хотел бы избежать второго запроса, если это вообще возможно. Есть ли функция/функция SQL Server/etc, которая будет создавать это значение без другого запроса?

ответ

1

Простое решение будет подвыборкой:

Select ... 
    , (Select Count(*) 
     From Table 
     Where ...) As TotalCount 
From Table 
Where ... 
Group By ... 

Если вы используете SQL Server 2005 или более поздней версии, вы можете сделать что-то вроде следующего:

With RankedItems As 
    (
    Select Col1 
     , Row_Number() Over (Order By Col1 Asc, Col2 Asc...) As Num 
     , Row_Number() Over (Order By Col1 Desc, Col2 Desc) As RevNum 
    From Table 
    Where ... 
    ) 
Select Col1, Min(Num + RevNum - 1) As TotalCount 
From RankedItems 
Group By Col1 
+0

Отлично, это делает именно то, что я хочу. Не знаю, почему я об этом не думал. – Dan

1

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

SELECT x.name, 
     y.name, 
     z.name, 
     AVG(x.tacos) AS average_tacos, 
     SUM(1) AS aggregated_row_count 
FROM .... 
WHERE ... 
GROUP BY x.name, y.name, z.name 
+0

Кажется, что это хорошо работает. Мне просто нужно было бы суммировать столбец aggregated_row_count в наборе результатов, чтобы получить общее количество строк. – Dan

Смежные вопросы