首页 > 解决方案 > SQL Select 根据数据集中的数字多次返回一行

问题描述

因此,我从这里尝试了许多其他尝试围绕这个主题的答案,到目前为止,一切要么彻底失败,要么没有给我我想要的结果:

我有一个 select 语句可用于包含交付信息的报告。结果集来自一个主表,每个交货编号(交货标题记录)只有一行,并且在数据集中还有一个称为托盘空间的字段,我们使用它来指示(您猜对了)需要多少托盘送货

我现在需要做的是以下几点:

  1. 找到那个托盘空间号
  2. 返回与该托盘空间编号相同次数的单个交货记录
  3. 在结果中包含一个新列,该列计数到该托盘空间数

例如,我的 SQL 将返回deliveries 表中的每条记录,看起来像这样

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 编号,然后多次返回特定行,然后还有一个新列来计算这些实例:

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

另一件要提的是,我自然会有数百条不同的交货记录(每条都作为一行返回),并且都有不同的托盘空间编号。当然,很明显我需要这条线只根据它自己的托盘空间数进行复制和计数

使用的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

标签: sqlsql-server-2008-r2

解决方案


使用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

推荐阅读