【问题标题】:Using Case When on SQL Server在 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

【问题讨论】:

    标签: sql-server tsql case


    【解决方案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 和类型有多行,您希望哪个值出现在您似乎想要的单行中?由于您的数据比您发布的更复杂,因此请使用该信息更新您的帖子。不要把它埋在评论里。也许这是“第一组”的情况(您可以搜索的术语)?
    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多