我有一个简单的查询
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"列表中的每个值重复每个结果行。它们实际上是日期,但为了清楚起见,我在这里使用了整数。
答案 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)
答案 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
答案 5 :(得分:0)
变体
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]