如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?

Posted

技术标签:

【中文标题】如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?【英文标题】:How to include BIT type column in SELECT part with out including it on the GROUP BY in T-SQL? 【发布时间】:2011-08-28 13:43:12 【问题描述】:

这是我的 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) 来避免 group by 列表中的 ProductName

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

我如何在SELECT 部分中包含BIT 类型列而不在GROUP BY 中包含它?

更新。

如果我需要以相同的方式在SELECT 中包含INT 之类的UserID 列,我应该怎么做

【问题讨论】:

这是 SQL Server 2008,但我也需要在 2005 年启动它 @marc_s 我从问题中省略了那部分查询 【参考方案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

【讨论】:

如果我需要以同样的方式在 SELECT 中包含像 UserID 这样的 INT 列,我应该怎么做 @Mithun P - 同样,您可以使用该列上的MAX(具有相同的免责声明),或切换到我显示的其他声明风格。 是否应该在SELECT *,ROW_NUMBER() OVER ( 行中添加“rn = ”?像这样:SELECT *,rn = ROW_NUMBER() OVER ( @WillNewton - 有两种方法可以关联别名 - alias = expressionexpression as alias - 我使用了第二种形式,但它向右滚动。 索引视图怎么样?由于我们不能在索引视图中使用 MAX(),有没有办法在索引视图中处理它? 【参考方案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

【讨论】:

以上是关于如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?的主要内容,如果未能解决你的问题,请参考以下文章

在 hive 的 select 语句中包含子查询结果

使用 REST Api,如何在我的类型化请求模型中包含“任何类型的 json”?

如何在 Java 中的 Prepared Select 语句中包含参数? [复制]

#1349 - 视图的 SELECT 在 FROM 子句中包含一个子查询

如何在 select 语句中包含 PERCENTILE_CONT 列,而不会生成有关 ORDER BY 子句或聚合函数的错误?

如何在数据透视语句中包含百分比计算