强制重复具有不同派生值的行

时间:2015-05-11 13:16:28

标签: sql tsql

我有一个简单的查询

SELECT  Group, Value, NULL AS MONTH from tbl_A

返回

 Group   Value  Month
 A       100    NULL
 B       110    NULL

我正在寻找返回的结果

Group   Value  Month
A       100    1
A       100    2
A       100    3
...
B       110    1
B       110    2
B       110    3
...

换句话说,我需要能够定义一个值列表,并为定义的" months"列表中的每个值重复每个结果行。它们实际上是日期,但为了清楚起见,我在这里使用了整数。

6 个答案:

答案 0 :(得分:7)

您可以使用VALUES子句定义Table Value Constructor (TVC)。然后CROSS APPLY以获得所需的结果集:

SELECT  [Group], Value, x.y AS MONTH 
from tbl_A
CROSS APPLY (VALUES (1), (2), (3)) x(y)

SQL Fiddle Demo

答案 1 :(得分:1)

尝试CROSS join,如下所示

select Group, Value, MONTH 
from tbl_A
cross join (select 1 as MONTH 
            union all
            select 2
            union all
            select 3
            union all
            select 4
            union all
            select 5
            union all
            select 6
            union all
            select 7
            union all
            select 8
            union all
            select 9
            union all
            select 10
            union all
            select 11
            union all
            select 12) B
order by Group, Value, MONTH 

答案 2 :(得分:1)

您可以创建一个表Months(或tbl_B如果您想保留您的命名约定)并使用您的Month值填充它,那么这应该是一个简单的事情这样:

SELECT a.[Group], a.Value, b.Month
FROM tbl_A a INNER JOIN tbl_B b
ON 1=1

由于ON 1=1(当然总是如此),这将加入每个表中的所有值。

答案 3 :(得分:1)

这样的事情可以解决问题:

DECLARE @tMonths TABLE (
[Number]    int)
INSERT  INTO @tMonths([Number])
VALUES  (1)
, (2)
, (3)

SELECT  *
FROM    groups g
INNER   JOIN    @tMonths m
ON  1 = 1

答案 4 :(得分:1)

如果您想要一个整数列表(几个月的列表):

SELECT [Group], Value, Month
FROM TBL
cross apply (
     SELECT DISTINCT MONTH = number 
  FROM master..[spt_values] 
  WHERE number BETWEEN 1 AND 12) A

SQL Fiddle

答案 5 :(得分:0)

使用递归cte

变体

WITH M
AS
(   SELECT n = 1
    UNION ALL
    SELECT n = n + 1
    FROM M
    WHERE n <= 12),    
tbl_A
AS
(   SELECT *
    FROM (
    VALUES ( 'A', 100, NULL ),
           ( 'B', 100, NULL )
    ) AS t([GROUP], Value, [Month])
)
SELECT A.[GROUP],
       A.Value,
       M.n AS [Month]
FROM       tbl_A AS A
CROSS JOIN M
ORDER BY [GROUP],
         [Month]