Sql server T-SQL交叉连接以获取缺少的值

Sql server T-SQL交叉连接以获取缺少的值,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,这是我的问题的一个简单例子。我有一个创建报告的存储过程 DECLARE @Report TABLE (Product VARCHAR(10), Purchases MONEY default (0) ) DECLARE @Range TABLE (minP MONEY, maxP MONEY, Descrip VARCHAR(50) ) INSERT @Range VALUES(0,1,'0-1'), (2,5,'2-5'), (6,10,'6-10') INSERT @Report(Pr

这是我的问题的一个简单例子。我有一个创建报告的存储过程

DECLARE @Report TABLE
(Product VARCHAR(10),
Purchases MONEY default (0) 
)
DECLARE @Range TABLE
(minP MONEY,
maxP MONEY,
Descrip VARCHAR(50)
)

INSERT @Range
VALUES(0,1,'0-1'),
(2,5,'2-5'),
(6,10,'6-10')

INSERT @Report(Product, Purchases)
VALUES('A',1),
('A',5),
('B',10)


SELECT r.Product, r.Purchases, x.Descrip  
FROM @Report r CROSS JOIN @Range x 
WHERE r.purchases BETWEEN x.minp AND x.maxp
结果如下所示:

Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
B   10.00   6-10
Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
A   0   6-10
B   0   0-1
B   0   2-5
B   10.00   6-10
我怎样才能得到这样的结果:

Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
B   10.00   6-10
Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
A   0   6-10
B   0   0-1
B   0   2-5
B   10.00   6-10
这应该做到:

SELECT B.Product, ISNULL(C.Purchases,0) Purchases, A.Descrip
FROM @Range A
CROSS JOIN (SELECT DISTINCT Product
            FROM @Report) B
LEFT JOIN @Report C
    ON B.Product = C.Product 
    AND C.Purchases BETWEEN A.minP AND A.maxP
ORDER BY B.Product, Purchases

供您尝试。

您可以尝试以下内容:

Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
B   10.00   6-10
Product Purchases   Descrip
A   1.00    0-1
A   5.00    2-5
A   0   6-10
B   0   0-1
B   0   2-5
B   10.00   6-10
  • 交叉连接不同范围的产品列表,以获得每个组合
  • 左键将此交叉连接列表与原始报表原始数据连接,以填写采购数据
  • 连接关系的逻辑将与原始的
    where
    子句相同(加上链接
    产品
示例查询 示例输出():
我想你的实际数据要比这复杂得多。例如,如果在一个范围内有多个购买,我不确定您希望得到什么样的结果。但这至少应该让你开始了。

@mellamokb看起来是这样;-)谢谢这确实让我开始了,你的解释帮助我想清楚了!