【问题标题】:How to include BIT type column in SELECT part with out including it on the GROUP BY in T-SQL?如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?
【发布时间】: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 我从问题中省略了那部分查询

标签: sql tsql group-by aggregate


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2014-06-06
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多