根据计算值多次打印出相同的行

时间:2014-03-25 01:07:47

标签: sql-server tsql sql-server-2012

我有一个返回类似于以下内容的查询:

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。

1 个答案:

答案 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