使用SQL Server创建一个包含重复行和新列的视图

时间:2016-04-25 10:35:13

标签: sql-server tsql view

我有一个包含以下列的表。

EVAL_ID    | GGRP_ID     | GOAL_ID 
1            1             1    
2            2             1
2            2             2
3            1             3

我想用另一个名为GOAL_VERSION的列创建一个视图,其值为1到3.因此,对于不同的GOAL_VERSION数字,上表中的每一行应重复5次。输出应该是这样的。

EVAL_ID    | GGRP_ID     | GOAL_ID    |GOAL_VERSION 
1            1             1            1
1            1             1            2
1            1             1            3
1            1             1            4
1            1             1            5
2            2             1            1
2            2             1            2
2            2             1            3
2            2             1            4
2            2             1            5

我该怎么做?帮我。谢谢。

5 个答案:

答案 0 :(得分:4)

这是你要找的吗?

DECLARE @tbl TABLE(EVAL_ID INT,GGRP_ID INT,GOAL_ID INT);
INSERT INTO @tbl VALUES
 (1,1,1)   
,(2,2,1)
,(2,2,2)
,(3,1,3);

SELECT tbl.*
      ,x.Nr
FROM @tbl AS tbl
CROSS JOIN (VALUES(1),(2),(3),(4),(5)) AS x(Nr)

编辑:改变重复次数

DECLARE @tbl TABLE(EVAL_ID INT,GGRP_ID INT,GOAL_ID INT);
INSERT INTO @tbl VALUES
 (1,1,1)   
,(2,2,1)
,(2,2,2)
,(3,1,3);

DECLARE @tblCountOfRep TABLE(CountOfRep INT);
INSERT INTO @tblCountOfRep VALUES(3);

SELECT tbl.*
      ,y.Nr
FROM @tbl AS tbl
CROSS JOIN (SELECT TOP (SELECT CountOfRep FROM @tblCountOfRep) * FROM(VALUES(1),(2),(3),(4),(5) /*add the max count here*/) AS x(Nr)) AS y 

在这种情况下,我更喜欢我的数字表...

答案 1 :(得分:1)

看看CROSS JOIN。如果你创建的表格中有一列你想要的5行,那么就可以通过CROSS JOIN来获得你想要的结果。

答案 2 :(得分:1)

您可以使用CTECROSS APPLY

来实现这一目标
;WITH CTE AS
(
    SELECT 1 AS GOAL_VERSION
    UNION
    SELECT 2
    UNION
    SELECT 3
    UNION
    SELECT 4
    UNION
    SELECT 5
)
SELECT * FROM <your table>
CROSS APPLY CTE

答案 3 :(得分:0)

使用&#34;使用&#34; (cte)带有用于创建视图的rank子句。

答案 4 :(得分:-1)

如果SQL数据库中有数字表,则可以将表与数字表交叉连接,以获得1到5之间的数字

以下是我的SQL解决方案

select 
   goals.*, 
   n.i as GOAL_VERSION
from goals, dbo.NumbersTable(1,5,1) n

以下是评论中建议的带有“交叉加入”的修改版本

select 
   goals.*, 
   n.i as GOAL_VERSION
from goals
cross join dbo.NumbersTable(1,5,1) n

你可以意识到,我为SQL numbers table使用了一个SQL表值函数 请使用参考教程中给出的源代码创建该SQL函数 我希望它有所帮助,