sql-server - T-SQL Cross Join 获取缺失值

标签 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(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

最佳答案

这应该可以做到:

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

Here is a demo供您尝试。

关于sql-server - T-SQL Cross Join 获取缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163312/

相关文章:

sql - 将表转换为 SQL Server 2016 中每列值的 JSON

sql - 如何在 Go for MSSQL 的选择查询中使用带有 % 的 LIKE?

sql - 选择具有特定逻辑的语句

sql-server-2008-r2 - 如何使用查询将 Active Directory 数据导入到 SQL Server 表中?

c# - 如何使用 C# 创建新的 SQL Server 2008 R2 登录

mysql - SQL Server Reporting Services 未从 SQL 存储过程传递正确的参数

SQL Server - 对于 XML - 从元素中获取空值

tsql - 在使用 STUFF FOR XML 连接之前对数据进行排序

sql - T SQL 格式 SSN/IN (SQL Server 2016+)

sql-server-2008 - 两个字符串使用 '=' 比较相等但在 'like' 比较中失败