下面是我的问题的一个简单示例。我有一个存储的proc来创建一个报告。
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
发布于 2013-01-05 03:21:14
您可以尝试如下所示:
product
)。将此交叉联接列表与原始报表原始数据联接以填写采购数据。
where
子句(加上链接product
))的逻辑相同
示例查询
SELECT
r2.Product,
coalesce(r.Purchases, 0) as Purchases,
x.Descrip
FROM
(select distinct Product from @Report) r2 CROSS JOIN @Range x
left join @Report r on r.purchases BETWEEN x.minp AND x.maxp
and r.product = r2.product
示例输出():
| PRODUCT | PURCHASES | DESCRIP |
---------------------------------
| A | 1 | 0-1 |
| A | 5 | 2-5 |
| A | 0 | 6-10 |
| B | 0 | 0-1 |
| B | 0 | 2-5 |
| B | 10 | 6-10 |
我假设您的实际数据比这复杂得多。例如,如果在一个范围内有多个购买,我不确定您期望的结果是什么。但这至少应该能让你开始。
发布于 2013-01-05 03:20:46
这应该可以做到:
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供您尝试。
https://stackoverflow.com/questions/14163312
复制相似问题