tsql-如何在SELECT部分中包括BIT类型列,而在T-SQL中不包括在GROUP BY中呢?

这是我的T-SQL查询

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

我只想将INT应用于UserID字段,但需要填充SELECT字段。

在这里,我使用聚合函数INT避免了按列表分组的UserID

但是对于INT列,相同的技巧不起作用,因为操作数数据类型位对于max运算符无效。

如何在UserIDT部分中包括INT类型的列,而在SELECT506中不包括它?

更新。

如果我需要以相同的方式在SELECT中包含INT列(如UserID),该怎么办

Mithun Sreedharan asked 2020-01-23T15:16:42Z
3个解决方案
88 votes

在其中放置一个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
Damien_The_Unbeliever answered 2020-01-23T15:17:10Z
10 votes

较短的方法:

IsActive = MAX(0+IsActive)
Mike Keskinov answered 2020-01-23T15:17:30Z
3 votes

在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
Alex Aza answered 2020-01-23T15:17:52Z
translate from https://stackoverflow.com:/questions/6053840/how-to-include-bit-type-column-in-select-part-with-out-including-it-on-the-group