Запрос SQL Server для всех столбцов с группировкой и наличием - PullRequest
0 голосов
/ 07 ноября 2019

Мне интересно, есть ли способ запросить все столбцы с группой и в SQL Server? Например, у меня есть 6 столбцов, a, b,…, f, и это то, что я хочу получить:

Select *
From table
Group by table.b, table.c
Having max(table.d)=table.d

Это работает в sybase, так как я пытаюсь перенести материал из sybase вSQL Server, я не уверен, что я могу сделать в новой среде. Спасибо.

Ответы [ 4 ]

0 голосов
/ 07 ноября 2019

Не используя имея , вы можете получить желаемый результат. Попробуйте ниже

Select table.b, table.c, max(table.d)
From table
Group by table.b, table.c
0 голосов
/ 07 ноября 2019

Вы можете использовать MIN, MAX, AVG, and COUNT functions with the OVER clause to provide aggregated values for each column (чтобы имитировать выражение group by для каждого столбца) и общее табличное выражение CTE, чтобы отфильтровать результаты (чтобы имитировать предложение has) как:

;With CTE as
(
SELECT  
         MIN(a) OVER (PARTITION BY a) AS MinCol_a  
       , MAX(b) OVER (PARTITION BY b) AS MaxCol_b 
       , AVG(c) OVER (PARTITION BY c) AS AvgCol_c  
       , COUNT(e) OVER (PARTITION BY d) AS Counte_PerCol_d  
FROM Tbl_Test   
)
select MinCol_a,MaxCol_b ,AvgCol_c,Counte_PerCol_d  
from CTE 
Join --here you can join the table Test results with other tables 
where --any filter condition similar to Having clause
0 голосов
/ 07 ноября 2019

Если вы хотите получить строки с максимальным значением d для каждой комбинации b и c, тогда используйте NOT EXISTS:

select t.* from tablename t
where not exists (
  select 1 from tablename
  where b = t.b and c = t.c and d > t.d 
) 

или с оконной функцией rank():

select t.a, t.b, t.c, t.d, t.e, t.f
from (
  select *, 
    rank() over (partition by b, c order by d desc) rn
  from tablename
) t
where t.rn = 1
0 голосов
/ 07 ноября 2019

Почему вы хотите группировать по каждому столбцу, если вы не используете агрегирующие функции в вашем выборе? Просто используйте следующий код, чтобы получить все столбцы таблицы:

select * from table

Группировка по используется только тогда, когда у вас есть функции aggragete (например, max (), avg (), count (), ... ) по вашему выбору.

Имеет ограничения на агрегированные столбцы и там, где нормальные столбцы таблицы.

...