Подтвердить что ты не робот

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

Вот мой запрос 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.

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

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

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

Обновить.

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

4b9b3361

Ответ 1

Поместите выражение 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

Ответ 2

Более короткий способ сделать это:

IsActive = MAX(0+IsActive)

Ответ 3

В 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