【问题标题】:Expand header row into multiple child rows将标题行展开为多个子行
【发布时间】:2015-07-14 09:07:08
【问题描述】:

在我的 SQL 数据库中,我有一个表,它代表门票 [书籍] 的书籍,其中书籍中的门票数量可能会有所不同。

这由[Books].[StartNo][Books].[BookSize] 两列表示

我需要实现的是一个选择语句,该语句为该书中的每张票重复表 [Books] 中的每一行,并带有一个显示该行票号的附加计算列。

所以从

--------+---------+----------
Book    | StartNo | BookSize 
--------+---------+----------
Book 1  |   1     |    3     
Book 2  |   4     |    4    
Book 3  |  19     |    4     

这样的事情

--------+---------+----------+----------
Book    | StartNo | BookSize | TicketNo
--------+---------+----------+----------
Book 1  |   1     |    3     |    1
Book 1  |   1     |    3     |    2
Book 1  |   1     |    3     |    3
Book 2  |   4     |    4     |    4
Book 2  |   4     |    4     |    5
Book 2  |   4     |    4     |    6
Book 2  |   4     |    4     |    7
Book 3  |  19     |    4     |   19
Book 3  |  19     |    4     |   20
Book 3  |  19     |    4     |   21
Book 3  |  19     |    4     |   22

我只是不太确定从哪里开始。

【问题讨论】:

  • 如果该解决方案与 sql server 2005 兼容,那就太好了,但我会满足于 2008 年

标签: sql sql-server sql-server-2005


【解决方案1】:

试试这个:

;WITH Counts AS (
    SELECT Max(StartNo + BookSize) AS TotalBookSize
    FROM t
), CTE(Tickets) AS (
    SELECT 1
    UNION ALL
    SELECT Tickets + 1
    FROM CTE
    WHERE Tickets < (SELECT TotalBookSize FROM Counts)
)
SELECT *
FROM t JOIN CTE ON CTE.Tickets BETWEEN t.StartNo AND t.StartNo + t.BookSize - 1

【讨论】:

  • [Books] 表包含大约 15k 本书,每本书包含 10 到 25 张门票。目前,当我将 CTE 付诸实践时,我得到一个最大递归错误。我可以通过设置“选项(maxrecursion 0)”来让它工作,但它会大大减慢。我已经尝试过使用 CTE 来优化它,但还没有想出任何东西……如果我这样做了会告诉你的。
【解决方案2】:

使用tally table

WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0 UNION ALL SELECT 0)
    ,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) --10 * 10 =  100
    ,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv0 b) --100 * 10 = 1000
    ,Tally (num) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv2)
    SELECT (num+StartNo-1) as TicketNo, *
    FROM   Tally
           CROSS JOIN Yourtable
    WHERE  num <= booksize
    ORDER  BY book 

【讨论】:

    【解决方案3】:

    您需要一个数字列表并将其与书籍表连接

    select b.*, number
    from Books b
    join master.dbo.spt_values v on v.number between b.StartNo AND b.StartNo+b.BookSize-1
    

    【讨论】:

      猜你喜欢
      • 2018-11-02
      • 2016-11-07
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2012-04-03
      • 2018-11-18
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多