在 SQL Server 上使用大小写

Posted

技术标签:

【中文标题】在 SQL Server 上使用大小写【英文标题】:Using Case When on SQL Server 【发布时间】:2021-11-06 20:00:51 【问题描述】:

我正在尝试通过 ID 的引用获取 行的特定值,并从这些中给出 selected 的结果行列

例如,我有一个这样的表:

member_id member_number member_type
1511 99084213654 CarMember
1511 4435654121 TaxiMember
1511 AA11133 BusMember
6612 97970897131 CarMember
6612 AA23564 BusMember

我需要将它转换成这样的表格

member_id CarMember TaxiMember
1511 99084213654 4435654121
6612 97970897131 NULL

我曾尝试使用这样的脚本,但没有帮助

with stg_1 as (
    select member_id,
    CASE WHEN member_type = 'CarMember' THEN member_number END AS CarMember,
    CASE WHEN member_type = 'TaxiMember' THEN member_number END AS TaxiMember
    FROM source_member
)
select * FROM

【问题讨论】:

【参考方案1】:

这里不需要 CTE。只需使用聚合函数来检索所需的结果。

-- SQL Server (v2017)
SELECT member_id
     , MAX(CASE WHEN member_type = 'CarMember' THEN member_number END) CarMember
     , MAX(CASE WHEN member_type = 'TaxiMember' THEN member_number END) TaxiMember
FROM source_member
GROUP BY member_id

请查看网址https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=2d71716a4c7b04f48062892b49429d9d

【讨论】:

欢迎@madfrostx。在上面的示例中,MAX() 用于消除 NULL 值。因为对于 id = 1511,表中存在两行,一是汽车,另一行是出租车。如果没有 MAX(),您将获得两行这样的成员,第一行 1511,汽车值,出租车为 NULL,第二行 1511,汽车为 NULL,出租车值【参考方案2】:

我认为您只是在尝试中错过了聚合部分。 请尝试以下操作:

;with stg_1 as (
    select member_id,
    max(CASE WHEN member_type = 'CarMember' THEN member_number END) AS CarMember,
    max(CASE WHEN member_type = 'TaxiMember' THEN member_number END) AS TaxiMember
    FROM source_member
    group by member_id
)
select * FROM stg_1

请看 dbfiddle here。

【讨论】:

我只想问,为什么要做这个任务需要MAX聚合? @madfrostx 只是为了将所有结果汇总到一个成员 ID 的一行中,否则您将获得相同 ID 的多行,而 max 对于选择非空值很有用。您必须对 id 进行分组才能将结果放在一行中。 @madfrostx 您可以在this 示例中清楚地看到为什么需要聚合才能获得所需的结果。 嗯,抱歉,如果行上有任何重复项,例如member_type 列上的重复项呢?我只需要在group by 上添加member_type 列吗? This is what I mean from the example @madfrostx 你需要学习和学习分组和聚合的概念。如果给定的成员 ID 和类型有多行,您希望哪个值出现在您似乎想要的单行中?由于您的数据比您发布的更复杂,因此请使用该信息更新您的帖子。不要把它埋在评论里。也许这是“第一组”的情况(您可以搜索的术语)?

以上是关于在 SQL Server 上使用大小写的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server数据库使用什么排序规则?

如何在 SQL Server 中使用大小写排名

SQL Server 的 LIKE 运算符是不是区分大小写?

SQL Server:将所有大写字母变为正确大小写/标题大小写

如何使用 Sql Server XQuery 搜索不区分大小写的单词?

SQL Server 不区分大小写的查询