SQL Select 到 return 根据数据集中的数字多次一行

SQL Select to return one line multiple times based on a number within the dataset

所以我尝试了很多其他尝试,从这里开始围绕这个主题寻找答案,但到目前为止,一切要么完全失败,要么没有给我想要的结果:

我有一个 select 语句用于生成交付信息的报告。结果集来自主 table,每个交货编号只有一行(交货 header 记录),并且在数据集中还有一个名为 palletspaces 的字段,我们用它来指示(你猜对了) 运送需要多少托盘

我现在需要做的是:

  1. 找到托盘空间数
  2. return单次发货记录次数与货位数量相同
  3. 在结果中包含一个新列,该列最多可计算到该货盘空间数

例如,我的 SQL 将 return 交付的每条记录 table 看起来像这样

id          traderid    toaddressid county         postcode palletspaces
D-124597    2101        2           READING        RG6 1AZ  3
D-124600    20060       12          MAGOR, GWENT   NP26 3DF 1
D-124601    20060       13          RUGBY          CV23 8YH 2

所以现在,我需要查看 palletspaces 编号,然后 return 多次查看特定行,然后还有一个新列来计算这些实例:

id          traderid    toaddressid county         postcode palletspaces    LineCount
D-124597    2101        2           READING        RG6 1AZ  3               1
D-124597    2101        2           READING        RG6 1AZ  3               2
D-124597    2101        2           READING        RG6 1AZ  3               3
D-124600    20060       12          MAGOR, GWENT   NP26 3DF 1               1
D-124601    20060       13          RUGBY          CV23 8YH 2               1
D-124601    20060       13          RUGBY          CV23 8YH 2               2

另一件要提到的事情是,我自然会有数百个不同的交货记录(所有 return 都编成一行),并且都有不同的托盘空间编号。当然,很明显我需要这条线只根据它自己的货盘空间数

进行复制和计数

正在使用的SQL如下

select 

deliveries.id,
deliveries.traderid,
customers.name,
deliveries.toaddressid,
deliveries.eutransportid,
deliveries.street,
deliveries.city,
deliveries.county,
deliveries.postcode,
delivery_custom.palletspaces,
ectransport.ectranspdesc

from deliveries

INNER JOIN customers ON
deliveries.traderid = customers.id
INNER JOIN delivery_custom ON 
deliveries.id = delivery_custom.id
INNER JOIN ectransport ON
deliveries.eutransportid = ectransport.ectranspcode

使用Recursive CTE,我们可以实现:

DECLARE @TAB TABLE ([D Number] VARCHAR(20) ,customer INT, postcode VARCHAR(20), palletspaces INT)

INSERT INTO @TAB VALUES('D-123456' ,19114, 'DA12 1TF' , 4)
INSERT INTO @TAB VALUES('D-111111' ,19114, 'DDDD 1TF' , 3)

;WITH CTE AS(
    SELECT [D Number],customer,postcode,palletspaces,1 AS A 
    FROM @TAB
    UNION ALL
    SELECT [D Number],customer,postcode,palletspaces,A+1 
    FROM CTE
    WHERE A<palletspaces
    )
SELECT * 
FROM CTE
ORDER BY [D Number], LineCount;

输出:

D Number    customer    postcode    palletspaces    LineCount
D-123456    19114       DA12 1TF    4               1
D-123456    19114       DA12 1TF    4               2
D-123456    19114       DA12 1TF    4               3
D-123456    19114       DA12 1TF    4               4

这样试试:

select deliveries.id,
    deliveries.traderid,
    customers.name,
    deliveries.toaddressid,
    deliveries.eutransportid,
    deliveries.street,
    deliveries.city,
    deliveries.county,
    deliveries.postcode,
    delivery_custom.palletspaces,
    ectransport.ectranspdesc
INTO #MyTemp
from deliveries
INNER JOIN customers ON
deliveries.traderid = customers.id
INNER JOIN delivery_custom ON 
deliveries.id = delivery_custom.id
INNER JOIN ectransport ON
deliveries.eutransportid = ectransport.ectranspcode


;WITH CTE AS(
    SELECT id,traderid,toaddressid,county,postcode,palletspaces,1 AS LineCount 
    FROM #MyTemp
    UNION ALL
    SELECT id,traderid,toaddressid,county,postcode,palletspaces,LineCount+1 
    FROM CTE
    WHERE LineCount<palletspaces
    )
SELECT * 
FROM CTE
ORDER BY id, LineCount;

DROP TABLE #MyTemp

希望这次你能明白。