sql - SQL Select 根据数据集中的数字多次返回一行
问题描述
因此,我从这里尝试了许多其他尝试围绕这个主题的答案,到目前为止,一切要么彻底失败,要么没有给我我想要的结果:
我有一个 select 语句可用于包含交付信息的报告。结果集来自一个主表,每个交货编号(交货标题记录)只有一行,并且在数据集中还有一个称为托盘空间的字段,我们使用它来指示(您猜对了)需要多少托盘送货
我现在需要做的是以下几点:
- 找到那个托盘空间号
- 返回与该托盘空间编号相同次数的单个交货记录
- 在结果中包含一个新列,该列计数到该托盘空间数
例如,我的 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
解决方案
使用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
推荐阅读
- javascript - 在没有客户端代码的情况下从服务器重定向用户
- go - 如何在不发送任何内容的情况下检查通道是否已满
- java - 如何在内部面板中呈现 GLUT 形状?
- flutter - 为什么我们在 Flutter/Dart 中的 catch 参数中加上“e”?
- excel - 如果单元格旁边的单元格不为空 [VBA],如何在一个范围内将单元格增加 1
- android - 我如何能够在我的 ui 背景中为 fab 按钮“剪裁”一个圆形?
- python - 尝试使用 skmultilearn.BinaryRelevance 预测新文本时出现 Matmul 错误
- python - Tkinter 图像标签不可见
- rxjs - 在 rxjs 中完成 Subject 对象后,我们可以再次发出一个值吗?
- r - R中的函数:不允许多参数