Как включить столбец типа 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
тем же способом
Ответы
Ответ 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