【问题标题】:Combining multiple column values into a single column row result将多个列值组合成单个列行结果
【发布时间】:2012-10-12 19:15:40
【问题描述】:

我有一个查询,它为一个场所拉入团体销售订单。我当前的查询提取了我需要的所有信息,但为每个订单号提供了多行:

ordCode cltClientName          adrCityDesc  adrStateDesc    adrZipCode  gsnValue2   evShow  shDescr
739802  Stevens Elementary,    Aberdeen         WA             98520       64        183    Group - Museum Admission
739802  Stevens Elementary,    Aberdeen         WA             98520       64        237    Extreme Planets

我希望看到每个订单只有一行,但最后一列的结果用逗号分隔:

ordCode cltClientName          adrCityDesc  adrStateDesc    adrZipCode  gsnValue2   evShow  shDescr
739802  Stevens Elementary,    Aberdeen         WA             98520       64        183    Group - Museum Admission, Extreme Planets

查询:

SELECT DISTINCT(ordCode),
        cltClientName, 
        adrCityDesc,
        adrStateDesc,
        adrZipCode,
        gsnValue2,
        evShow,
        shDescr

--COUNT(tiCode)
  from Orders 
        inner join OrderContacts on orcOrderNumber = ordCode
        inner join Clients on orcClientID = cltCode
        inner join ClientAddresses on cltCode = claClientCode
        inner join Addresses on claAddressCode = adrCode
        inner join Tickets on tiOrder = ordCode
        inner join dbo.Events on tiEvent = evCode
        inner join GroupSaleNotes on ordCode = gsnOrderNumber
        inner join Shows on evShow = shCode
 WHERE ordOrderTypeTitle = 7 -- Group Sales only
  and ordOpenDate between '2011-06-01 00:00:00.000' and '2012-05-31 23:59:59.999'
  and gsnNoteType = '5'
  and cltIsGroupLeader = '1'
   --and evShow in (106, 107)
 GROUP BY ordCode, cltClientName, cltCode, adrCityDesc, adrStateDesc,
      adrZipCode, gsnValue2, evShow, shDescr
ORDER BY adrCityDesc, cltClientName

有没有办法合并这部分结果集?

【问题讨论】:

标签: sql sql-server sql-server-2005 group-by


【解决方案1】:

您之前有一个问题标记为 MySQL,因此 MySQL 的解决方案是使用GROUP_CONCAT()

SELECT ordCode,
  cltClientName, 
  adrCityDesc,
  adrStateDesc,
  adrZipCode,
  gsnValue2,
  group_concat(evShow),
  group_concat(shDescr)
from Orders 
inner join OrderContacts 
  on orcOrderNumber = ordCode
inner join Clients 
  on orcClientID = cltCode
inner join ClientAddresses 
  on cltCode = claClientCode
inner join Addresses 
  on claAddressCode = adrCode
inner join Tickets 
  on tiOrder = ordCode
inner join dbo.Events 
  on tiEvent = evCode
inner join GroupSaleNotes 
  on ordCode = gsnOrderNumber
inner join Shows 
  on evShow = shCode
WHERE
  ordOrderTypeTitle = 7 -- Group Sales only
  and ordOpenDate between '2011-06-01 00:00:00.000' and '2012-05-31 23:59:59.999'
  and gsnNoteType = '5'
  and cltIsGroupLeader = '1'
  --and evShow in (106, 107)
GROUP BY ordCode,
  cltClientName, 
  cltCode,
  adrCityDesc,
  adrStateDesc,
  adrZipCode,
  gsnValue2
ORDER BY adrCityDesc,
  cltClientName

这会将GROUP_CONCAT() 应用于evShowshDescr 列,因为这两个列都有多个值。

在 SQL Server 中,您可以使用类似的东西(未经测试):

SELECT ordCode,
  cltClientName, 
  adrCityDesc,
  adrStateDesc,
  adrZipCode,
  gsnValue2,
  stuff((select distinct ', ' + cast(e.evShow as varchar(10))
         from dbo.events e
         where tiEvent = evCode
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') evShow,
  stuff((select distinct ', ' + cast(e.shDescr as varchar(10))
         from dbo.events e
         where tiEvent = evCode
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') evShow,
from Orders 
inner join OrderContacts 
  on orcOrderNumber = ordCode
inner join Clients 
  on orcClientID = cltCode
inner join ClientAddresses 
  on cltCode = claClientCode
inner join Addresses 
  on claAddressCode = adrCode
inner join Tickets 
  on tiOrder = ordCode
--inner join dbo.Events 
--  on tiEvent = evCode
inner join GroupSaleNotes 
  on ordCode = gsnOrderNumber
inner join Shows 
  on evShow = shCode
WHERE
  ordOrderTypeTitle = 7 -- Group Sales only
  and ordOpenDate between '2011-06-01 00:00:00.000' and '2012-05-31 23:59:59.999'
  and gsnNoteType = '5'
  and cltIsGroupLeader = '1'
  --and evShow in (106, 107)
GROUP BY ordCode,
  cltClientName, 
  cltCode,
  adrCityDesc,
  adrStateDesc,
  adrZipCode,
  gsnValue2
ORDER BY adrCityDesc,
  cltClientName

【讨论】:

  • 这很接近。最后一列现在包含 shDescr 列中的 每个 值的逗号分隔列表。我试过玩它,但没有运气。有什么想法吗?
  • @StephenYo 您将不得不使用这些表的连接,您可能需要在STUFF() 代码中添加其他表。由于您没有在字段前加上表名或别名,因此很难分辨出每个表中的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多