【问题标题】:Concatenate rows from a complex select in SQL连接来自 SQL 中复杂选择的行
【发布时间】:2014-06-21 14:49:49
【问题描述】:

RDBMS 是 SQL Server 2008。

我有 3 张桌子。为了简化,它们看起来像这样:

NominationOrder表:

NominationOrderId | NominationId
         1        |      5
         2        |      9

NominationOrderItem表:

NominationOrderItemId | NominationOrderId | GiftId
           1          |         1         |    6
           2          |         1         |    3
           3          |         1         |    9

Gift表:

GiftId | GiftName |
  3    |   TVSet
  6    |  TabletPC
  9    | LittlePonny

所以,有一些Nomination。每个Nomination 可能有1 个Nomination Order。每个Nomination Order 可能有很多Nomination Order Items,每个Gift 从这个顺序中引用。

我正在为 Reporting Services 制作报告,我需要在单行中显示每个提名的数据,其中 Gift 显示串联的 Gift 名称。

目前看起来是这样的:

NominationId | NominationOrderId |    GiftName
      5      |          1        |     TVSet     
      5      |          1        |    TabletPC    
      5      |          1        |   LittlePonny

我需要它看起来像这样:

NominationId | NominationOrderId |           GiftName
      5      |          1        |   TVSet, TabletPC, LittlePonny

当前 SQL 查询的简化示例:

  select 
    nn.NominationId
    ,n_o.NominationOrderId
    ,g.name GiftName
from dbo.Nomination nn
    LEFT JOIN dbo.NominationOrder n_o ON n_o.NominationId = nn.NominationId
    LEFT JOIN dbo.NominationOrderItem noi ON noi.NominationOrderId = n_o.NominationOrderId
    left join dbo.Gift g on g.GiftId = noi.GiftId

如何重写它以在单个字符串中输出并连接礼物名称?

【问题讨论】:

  • 你使用的是什么关系型数据库?
  • @Mureinik,这是 MSSQL 2008,谢谢通知!
  • 第四张桌子在哪里?Nomination
  • 每个NominationId可以送多少礼物?

标签: sql sql-server sql-server-2008 concatenation


【解决方案1】:
SELECT result.NominationId, Substring(result.Gifts,3,Len(result.Gifts) - 3)
FROM (
    SELECT 
    NominationId, 
    (SELECT ', ' + CAST(g.GiftName AS varchar(MAX)) 
        FROM NominationOrder i 
        INNER JOIN NominationOrderItem noi on i.NominationOrderId = noi.NominationOrderId
        INNER JOIN Gift g on noi.GiftId = g.GiftId
        WHERE i.NominationId = n.NominationId
        FOR XML PATH (''))
         AS Gifts
    FROM NominationOrder n
    GROUP BY NominationId
) result

【讨论】:

    【解决方案2】:

    您可以使用 CTE:

    WITH cteTbl (NominationId, NominationOrderId, GiftName) AS ( Your Query here)
    

    然后将所有具有相同NominationIdNominationOrderId 的行用FOR XML PATH('') 连接起来,然后用STUFF 替换第一个逗号,

    SELECT t.NominationId
         , t.NominationOrderId
         , STUFF( ( SELECT ', ' + GiftName
                    FROM cteTbl
                    WHERE NominationId = t.NominationId
                      AND NominationOrderId = t.NominationOrderId
                    ORDER BY GiftName DESC
                    FOR XML PATH('') ), 1, 1, '')
    FROM cteTbl t 
    GROUP BY t.NominationId
           , t.NominationOrderId
    

    SQLFiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多