为SQL Server中的每个组返回带有额外行的分组数据

时间:2013-03-24 07:57:08

标签: sql-server tsql

我有表格Composition,CompositionDetails和Tracks
组合持有组合名称,而compositionDetails用于映射具有组合的轨道。一个作品可以有多个曲目。

表结构如下:

撰写表 - CompositionId,CompositionName
曲目表 - TrackId,TrackName
CompositionDetails - CompositionId(FK),TrackId(FK)

现在通过我的查询,我能够实现这一目标:

enter image description here

但我想要这个:

enter image description here

我的意思是每组构图上方多一行。
我实现了创建临时表和循环以插入额外的行。但是有数百万的数据,它很慢。

有关如何在不创建临时表和重复循环以插入新行的情况下如何实现此目的的任何建议?

3 个答案:

答案 0 :(得分:2)

Select Componame,TrackTitle from
(
Select Componame,TrackTitle,Componame as h,1 as Sort
from Composition
UNION 
Select Componame,Componame,MIN(Componame),0 as Sort
from Composition
group by Componame
) a
Order by h,Sort,Componame,TrackTitle

答案 1 :(得分:0)

试试这个

SELECT c2.CompositionName, c2.CompositionName, c2.CompositionId
FROM Composition c2
UNION
SELECT c.CompositionName, t.TrackName, cd.CompositionId
FROM CompositionDetails cd join Composition c ON cd.CompositionId = c.CompositionId
JOIN Tracks t on t.Trackid = cd.Trackid

答案 2 :(得分:0)

假设CompositionDetails表在TrackId列中没有包含NULL的行:

  1. 使用UNION,将每TrackId的空格(NULL)CompositionId添加到CompositionDetails

  2. 将结果集合内连接到Composition

  3. 使用Tracks左连接内部联接的结果。显然,这将为#1中添加的行生成NULL轨道名称。

  4. 在ORDER BY子句中,先按CompositionName排序,然后按TrackName排序。 (在Transact-SQL中,NULL在任何值之前。因此,具有空白轨道名称的行将在其各自组中的其他行之前。)

  5. 在SELECT子句中,使用COALESCEISNULL将空白曲目名称替换为组合名称。

  6. SELECT
      c.CompositionName,
      COALESCE(t.TrackName, c.CompositionName)
    FROM
      Composition AS c
      INNER JOIN (
        SELECT          CompositionId, TrackId FROM CompositionDetails
        UNION ALL
        SELECT DISTINCT CompositionId, NULL    FROM CompositionDetails
      ) AS d ON c.CompositionId = d.CompositionId
      LEFT JOIN Tracks AS t ON d.TrackId = t.TrackId
    ORDER BY
      c.CompositionName,
      t.TrackName
    ;