【问题标题】:How to show multiple columns in a single column in SQL?如何在 SQL 的单列中显示多列?
【发布时间】:2020-06-06 13:02:18
【问题描述】:

我有一个表参加者,当加入表参加者与表会议时,参加者可以参加许多会议。因此,当显示与会者以及他们参加了哪些会议时,我会得到多行相同的与会者,例如:

John Doe-BMW Conference
John Doe-Blockchain conference
Jane Doe-blabla
John Doe- Mercedess

sql中有没有办法显示

John Doe-宝马会议,梅赛德斯,区块链?

SELECT Distinct
  attendee.Id, attendee.Firstname, attendee.PhoneNumber,
  attendee.Email,attendee.Town, attendee.BloodType, session.Id ,
  session.LocationId , session.Name as SessionName , location.Id ,
  location.Name as Location_Name , sessionattended.SessionAttendedId,
  sessionattended.SessionId, sessionattended.AttendeeId,
  attendee.Lastname
FROM `session`, `attendee`, `sessionattended`, `location`
WHERE attendee.Id = sessionattended.AttendeeId 
  and session.Id = sessionattended.SessionId 
  and session.LocationId = location.Id;

【问题讨论】:

  • 你为什么选择不使用正确的、明确的、标准的、可读的JOIN语法?
  • 使用GROUP BY。并且还使用自 SQL-92(28 年前)以来可用的现代连接语法。
  • group by 如何帮助? @TheImpaler
  • GROUP BY <columns> 会将多行聚合为一行。这似乎就是你想要的。
  • 这个问题的答案在很大程度上取决于您使用的 DBMS(MySQL、MariaDB、Postgres、Microsoft SQL Server 等)和版本。请您edit指定问题。

标签: sql


【解决方案1】:

使用 GROUP_CONCAT MySQL(很久才可用)

或 STRING_AGG MSSQL(在 2017 及更高版本中可用)

对于两者的比较,请参阅:https://database.guide/mysql-group_concat-vs-t-sql-string_agg/

Google 会在其他 DBMS 中找到有关如何执行此操作的信息,甚至可以找到如何以“旧方式”执行此操作的信息,例如:GROUP BY to combine/concat a column

【讨论】:

    【解决方案2】:

    试试这个。基本上这个想法是对这种类型的结果使用 FOR XML PATH。

    SELECT Distinct
           a.Id, a.Firstname, a.PhoneNumber, a.Email,a.Town, a.BloodType, 
           all_conferences = STUFF((SELECT ',' + CAST(s1.Name as Varchar) 
                                    FROM sessionattended sa1  
                                    JOIN Session s1 ON sa1.SessionId = s1.Id
                                    WHERE sa1.AttendeeId = sa.AttendeeId FOR XML PATH('') ), 1, 1, '')
    
    FROM `session` s
    JOIN `sessionattended` sa ON sa.SessionId = s.Id
    JOIN `attendee` a ON a.Id = sa.AttendeeId 
    JOIN `location` l ON s.LocationId = l.Id
    

    【讨论】:

    • 这将是一个很好的答案 如果 问题指定了 MS SQL Server,以及 2017 年之前的版本。可能还有其他需要此解决方法的场景,但对于MySQL、较新的 SQL Server 版本和 Postgres,首先,这不是最好的答案。不幸的是,这个问题实际上并没有具体说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多