【问题标题】:Combine multiple boolean columns into a single column将多个布尔列合并为一列
【发布时间】:2020-03-12 13:24:53
【问题描述】:

我正在从 ERP 系统生成报告,其中为用户提供了一个复选框,该复选框为每个选定的项目返回一个布尔值。数据库托管在 SQL Server 上。

但是,用户也可以选择具有其他值的Contracts,如下所示。

我想将类别捕获为单个列,并且我不介意视图中有重复的行。我希望第一行返回 Contract,第二行返回选择的其他值,用于相同的参考 ID。

【问题讨论】:

  • 表或结果集中的行没有定义的顺序,没有一列(或一组列)来枚举所需的顺序。这两个建议都忽略了这个事实——它们可能看起来有效,但这是环境的产物。

标签: sql sql-server tsql


【解决方案1】:

你可以使用apply

select distinct t.*, tt.category
from t cross apply
     ( values ('Contracts', t.Contracts),
              ('Tender', t.Tender),
              ('Waiver', t.Waiver),
              ('Quotation', t.Quotation)
     ) tt(category, flag)
where flag = 1;

【讨论】:

  • 你好。我们如何捕获额外的类别“无”,其中合同、投标、弃权和报价均为 0?
【解决方案2】:

我想一个简单的方法是:

select *, 'Contract' as [Category] from [TableOne] where [Contract] = 1
union all select *, 'Tender' as [Category] from [TableOne] where [Tender] = 1
union all select *, 'Waiver' as [Category] from [TableOne] where [Waiver] = 1
union all select *, 'Quotation' as [Category] from [TableOne] where [Quotation] = 1
union all select *, '(none)' as [Category] from [TableOne] where [Contract]+[Tender]+[Waiver]+[Quotation] = 0
order by [Reference ID]

请注意,最后一行是为了以防万一您需要处理全零的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2020-05-01
    • 2021-07-09
    • 2022-07-20
    • 2018-07-05
    • 2020-04-14
    相关资源
    最近更新 更多