Как включить столбец типа BIT в часть SELECT, не включая его в GROUP BY в T-SQL? - PullRequest
49 голосов
/ 19 мая 2011

Вот мой запрос T-SQL

SELECT 
    ProductID,
    VendorID,
    ProductName= MAX(ProductName),
    VendorName = MAX(VendorName),
    IsActive = MAX(IsActive) # This brings error 
FROM ProductVendorAssoc 
GROUP BY  
    ProductID,
    VendorID

Я хочу применить GROUP BY только для полей ProductID and VendorID, но нужно заполнить поля ProductID, VendorID, ProductName, VendorName, IsActive.

Здесь я использовал функцию агрегирования MAX(ProductName), чтобы избежать ProductName в группе по списку.

Но тот же трюк не работает для столбцов BIT, поскольку бит типа операнда недопустим для оператора max.

Как включить столбец типа BIT в часть SELEC Tбез включения его в GROUP BY?

Обновление.

Что мне нужно сделать, если мне нужно включить столбец INT, например UserIDв SELECT таким же образом

Ответы [ 3 ]

86 голосов
/ 19 мая 2011

Поместите туда выражение CASE или преобразуйте его в int:

IsActive = MAX(CASE WHEN IsActive=1 THEN 1 ELSE 0 END)

или

IsActive = MAX(CONVERT(int,IsActive))

Вы также должны знать, что это означает, что значения в столбцах ProductName, VendorName и IsActive в наборе результатов могут быть взяты из разных строк в базовой таблице.


Если вы хотите, чтобы все эти три столбца действительно были из одной строки (и предполагая, что SQL Server 2005 или более поздняя версия), вы бы сделали что-то вроде:

;With Numbered as (
    SELECT *,ROW_NUMBER() OVER (
        PARTITION BY ProductID,VendorID
        ORDER BY /* Something appropriate, or if we just want random... */ newid()) as rn
    FROM ProductVendorAssoc
)
select
    ProductID,
    VendorID,
    ProductName,
    VendorName,
    IsActive
FROM Numbered where rn=1
10 голосов
/ 13 ноября 2015

Сокращенный способ сделать это:

IsActive = MAX(0+IsActive)
3 голосов
/ 19 мая 2011

В SQL2005 / 2008 это будет выглядеть так:

select ProductId, VendorId, ProductName, VendorName, IsActive
from
(
    select *, row_number() over (partition by ProductId, VendorId order by ProductId) RowNumber
    from Production.Product
) tt
where RowNumber = 1
...