这是我的T-SQL查询

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

我只想为ProductID and VendorID个字段申请GROUP BY,但需要填充ProductID, VendorID, ProductName, VendorName, IsActive个字段.

在这里,我使用agreegate函数MAX(ProductName)来避免GROUPBY列表中的ProductName.

但同样的技巧不适用于BIT列,因为操作数数据类型bit对max运算符无效.

我怎样才能在SELECT部分包含BIT型柱,而在GROUP BY部分不包含它?

Update.

如果我需要以同样的方式包含INT列,比如UserID in SELECT,我应该怎么做

推荐答案

在其中放入大小写表达式,或将其转换为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

Sql相关问答推荐

删除与破折号(-)链接的相互重复的字符

当编号和版本的唯一状态更改时报告

如何实现一个广泛的多级自连接PostgreSQL查询?

为表中每个缺少的引用创建新行

转换表中的数据

部分匹配表中元素的MariaDB查询查找结果

一个SQL查询将在需要的地方多次返回同一成员

如何根据计数和分组获取订单总数

值对于类型字符来说太长

DBeaver将过程中的属性列表转换为字符串

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

在Postgres中合并相似的表

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

DB2 SQL查询结果多余数据

在 R 值的 SQL 块中显示值

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

如何 for each id创建长度等于id长度的不同日期序列?

两个具有 NULL 值的表达式结果之间的差异

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

使用 regexp_replace 替换所有出现的特殊字符