从一行连接多个行与关系

时间:2016-02-18 15:37:22

标签: sql sql-server cursor common-table-expression

如果你能帮助我,我真的很感激。我需要的是在一个特定范围内创建每个日期,这是通过以下查询完成的。但是我需要为每一行分配这个范围日期。

--Dates in rage
SELECT DATEADD(DAY, nbr - 1, '2016-02-08')
FROM   (
SELECT ROW_NUMBER() OVER(ORDER BY c.object_id) AS Nbr
FROM   sys.columns c
) nbrs
WHERE  nbr - 1 <= DATEDIFF(DAY, '2016-02-08', '2016-02-11')

Table_A
Jhon
JhonB
JhonC

Table_Calendar (2016-02-08 / 2016-02-11)
2016-02-08
2016-02-09
2016-02-10
2016-02-11

UNION 
JHON  2016-02-08
JHON  2016-02-09
JHON  2016-02-10
JHON  2016-02-11
JHONB 2016-02-08
JHONB 2016-02-09
JHONB 2016-02-10
JHONB 2016-02-11

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

你已经完成了范围的一半。正如肖恩所指出的,当你没有关系时,你需要应用交叉连接/交叉申请,尽管每个人都有不同的用法。

with cte
as
(
SELECT DATEADD(DAY, nbr - 1, '2016-02-08') as dates
FROM   (
SELECT ROW_NUMBER() OVER(ORDER BY c.object_id) AS Nbr
FROM   sys.columns c
) nbrs
WHERE  nbr - 1 <= DATEDIFF(DAY, '2016-02-08', '2016-02-11')
)
select 
* from cte
cross join
yourtable

---使用数字的另一个版本

declare @rangestartdate datetime
set @rangestartdate=getdate()-10
declare @rangeenddate datetime
set @rangeenddate=getdate()

    ;with cte
    as
    (
    select 
    dateadd(day,n,@rangestartdate) 
    from dbo.numbers
    where n<datediff(day,@rangestartdate,@rangeenddate)
    )
    select * from cte
    cross join
    yourtable

您可以通过不同的方式填充数字表here及其用途