我有一个返回类似于以下内容的查询:
Zone | NeededItems
===========================
209 | 5
213 | 1
216 | 1
220 | 2
218 | 1
219 | 4
215 | 1
背后的查询类似于:
SELECT
r.Zone as Zone, r.Required - COUNT(i.Item) as NeededItems
FROM
MyItems i
INNER JOIN
MyRequirements r ON i.Zone = r.Zone
GROUP BY
r.Zone, r.Required
MyItems的样子:(物品的价值无关紧要)
Zone | Item
================
209 | a
209 | b
209 | c
216 | a
220 | a
213 | z
218 | x
219 | q
219 | w
219 | e
219 | r
215 | t
MyRequirements看起来像:
Zone | Required
======================
209 | 8
213 | 2
216 | 2
220 | 3
218 | 2
219 | 5
215 | 2
我需要做的是根据Needed中的值多次打印Zone。 Needed中的值是一个计算值,这使得这很困难(我不能只删除计数!)
所以我要找的结果只是一个区域列表,每个区域都显示出需要的次数。
Zone
====
209
209
209
209
209
213
216
220
220
218
219
219
219
219
215
在SQL中有什么办法可以做到这一点吗?使用SQL Server 2012。
答案 0 :(得分:0)
下面是一种方式 - 使用e1,e2和e3查询并不是最干净的方法,但它是我能够设法获得的唯一方式它工作。
一点限制:它只适用于每个项目多达1000项(对我来说已经足够了。)这可以通过编辑WHERE c<9
来改变,但要注意这是递归的,所以最好不要超过它需要什么。
WITH CTE as
(
SELECT
r.Zone as Zone, r.Required - COUNT(i.Item) as NeededItems
FROM
MyItems i
INNER JOIN
MyRequirements r ON i.Zone = r.Zone
GROUP BY
r.Zone, r.Required
),
e1(n,c ) AS
(
SELECT 1, 0
UNION ALL
SELECT n, c + 1
FROM e1
WHERE c<9
), -- 10
e2(n) AS
(
SELECT 1 FROM e1 CROSS JOIN e1 AS b -- 100
),
e3(n) AS
(
SELECT 1 FROM e1 CROSS JOIN e2 -- 1000
),
Numbers AS
(
SELECT n = ROW_NUMBER() OVER (ORDER BY n) FROM e3
)
SELECT
Zone
FROM
Numbers
INNER JOIN
CTE on CTE.NeededItems >= n ORDER BY Zone