在 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 的 LIKE 运算符是不是区分大小写?
SQL Server:将所有大写字母变为正确大小写/标题大小写