【问题标题】:Selecting Multiple Values from Single Column从单列中选择多个值
【发布时间】:2020-02-20 16:47:13
【问题描述】:

我有下表:

att_id | user_id | att_name  | att_value
1      | 202     | first_name| Cris    
2      | 202     | last_name | Williams
3      | 202     | email     | cwill122@yahoo.com

我想返回如下表格:

202  | Chris | Wiliams | cwill122@yaoo

【问题讨论】:

    标签: sql group-by pivot


    【解决方案1】:

    您可以进行条件聚合。这是透视数据集的规范方法:

    select 
        user_id,
        max(case when att_name = 'first_name' then att_value end) first_name,
        max(case when att_name = 'last_name'  then att_value end) last_name,
        max(case when att_name = 'email'      then att_value end) email
    from mytable
    group by user_id
    

    【讨论】:

      【解决方案2】:

      我的建议是将字段 att_name att_value 放在另一个表中并进行 join

      【讨论】:

        【解决方案3】:

        您需要自行加入表,并为其赋予别名。

        SELECT t1.att_value, t2.att_value, t3.att_value FROM [tablename] t1 JOIN [tablename] t2 ON t1.att_id = t2.att_id JOIN [tablename] t3 ON t3.att_id = t1.att_id WHERE user_id = 202

        【讨论】:

          【解决方案4】:

          将 user_id 存储在一个变量中(比如 uid),然后在其他变量中获取 uid 的 first_name、last_name、email。然后你可以将它们插入到一个新表中。或者您可以使用 join 来完成工作并创建一个视图以供将来使用。

          【讨论】:

            【解决方案5】:

            您可以使用 PIVOT(MSSQL/TSQL)。

            WITH PivotData AS
            (
                SELECT user_id, att_name, att_value FROM dbo.AttTable
            )
            SELECT user_id, first_name, last_name, email
            FROM PivotData
                PIVOT(MAX(att_value) FOR att_name IN(first_name, last_name, email)) AS P;
            

            测试数据

            CREATE TABLE dbo.AttTable
            (
                att_id INT NOT NULL,
                user_id INT NOT NULL,
                att_name VARCHAR(50) NOT NULL,
                att_value VARCHAR(50) NOT NULL,
                PRIMARY KEY (att_id, user_id)
            );
            
            INSERT INTO dbo.AttTable
                (att_id, user_id, att_name, att_value)
            VALUES
                (1, 202, 'first_name', 'Cris'),
                (2, 202, 'last_name', 'Williams'),
                (3, 202, 'email', 'cwill122@yahoo.com')
            

            【讨论】:

              【解决方案6】:
              select 
                  I.user_id,A.fname, B.lname, C.email
                  from 
                  (select distinct user_id from AttTable) I
                  left join 
                  (select user_id, att_value as fname from AttTable where att_name = 'first_name') A
                  on I.user_id =  A.user_ID
                  left join
                  (select user_id, att_value as lname from AttTable where att_name = 'last_name') B
                  on I.user_id = B.user_id
                  left join 
                  (select user_id, att_value as email from AttTable where att_name = 'email') C
                  on I.user_id = C.user_id 
              

              【讨论】:

                猜你喜欢
                • 2015-01-07
                • 1970-01-01
                • 1970-01-01
                • 2015-09-25
                • 2022-06-23
                • 2021-11-10
                • 2011-08-30
                • 2018-12-16
                • 1970-01-01
                相关资源
                最近更新 更多