这是我在这里的第一个问题,所以如果我做错了,我会道歉。我也是一个SQL爱好者,如果我没有任何意义,那就很抱歉。我正在使用SQL Server 2014。
我的日期范围是日期(2015年1月11日至11月30日),我有3个地点名称:NY,LA,SF。我是否可以将每个名称显示在范围内的每个日期的单独行中?
这样的事情:
11/01/15 |纽约
11/01/15 | LA
11/01/15 | SF
11/02/15 |纽约
11/02/15 | LA
11/02/15 | SF
11/03/15 |纽约
11/03/15 | LA
11/03/15 | SF
。
。
。
。
11/30/15 |纽约
11/30/15 | LA
11/30/15 | SF
答案 0 :(得分:1)
看到你的CTE:
WITH mycte
AS
(
SELECT CAST('20151101' AS DATETIME
) DateValue
UNION ALL
SELECT DateValue + 1
FROM mycte
WHERE DateValue + 1 < '20151201'
),
myNames
(myName
)
AS
(
SELECT 'NY'
UNION
SELECT 'LA'
UNION
SELECT 'SF'
)
SELECT *
FROM mycte m
CROSS JOIN myNames mn;
答案 1 :(得分:0)
假设日期位于名为myDates的表中,名称位于名为myNames的表中,字段名分别为myDate和myName:
select d.myDate, n.myName
from myDates d
cross join myNames n
where d.MyDate >= '20151101' and d.myDate < '20151201'
答案 2 :(得分:0)
试试这个:
DECLARE @StartDate DATE = '20150111'
DECLARE @EndDate DATE = '20151130'
DECLARE @Diff INT = DATEDIFF(DAY, @StartDate, @EndDate)
PRINT @Diff
;WITH DateRangeCte AS (
SELECT DATEADD(DAY, currDay - 1, @StartDate) AS RangeDate
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS currDay
-- this table should have more records than range size
FROM sys.messages
) nbrs
WHERE currDay - 1 <= @Diff
)
SELECT RangeDate, LocationName
FROM DateRangeCte C
CROSS JOIN (
SELECT 'NY' AS LocationName UNION ALL
SELECT 'LA' UNION ALL
SELECT 'SF'
) Loc
go
根据建议,DateRangeCte
可以使用recursive CTE生成,也可以通过迭代“足够大”的表生成(已知行数大于间隔大小)。我选择了sys.message,因为它非常大(超过200K),但它会对性能产生影响。如果性能很重要,请选择递归CTE(st33vemcqu33n's
回答)。
另外,我有一个“匿名”表格CROSS JOINED。我猜这些状态将存储在持久表中,因此您将与该表交叉连接。