SQL - 如何复制行但只更改一列信息?
SQL - How to duplicate rows but change only one column info?
tblWeeks table 有周数和日期列(仅每周四)
像这样:
WeekNum Date
1496 2015-7-2
1497 2015-7-9
1498 2015-7-16
fnBenchmarkData 函数将 return 基于指定周数参数的每周数据。
我使用交叉应用来显示所有周的基准数据:
SELECT p.weeknum, p.date, q.Key, q.ID, q.Score
FROM tblWeeks AS p
cross apply
fnBenchmarkData(p.weeknum) as q
现在我的问题是,从 function 和 weeknum 生成的分数数据将在每周四更新并保持不变直到下周三,即 周四 - 下周三是 "loop" 并且所有分数数据都相同,weeknum 也相同。但是,该函数仅 return 星期四。
交叉应用只会显示每个星期四的数据,我想显示其余的工作日,基本上复制行但更改日期。
例如,下面是我从交叉应用中得到的:
WeekNum Date Score
1496 2015-7-2 (Thur) 1
1497 2015-7-9 (Thur) 5
1498 2015-7-16(Thur) 7
....
我想要我的交叉应用 SQL return 像这样:
WeekNum Date Score
1496 2015-7-2 (Thur) 1
1496 2015-7-3 1
/* No data stored for weekend
1496 2015-7-6 1
1496 2015-7-7 1
1496 2015-7-8 1
1497 2015-7-9 (Thur) 5
1497 2015-7-10 5
1497 2015-7-13 5
1497 2015-7-14 5
1497 2015-7-15 5
1498 2015-7-16(Thur) 7
有人知道怎么做吗?非常感谢!
我认为最简单的方法是使用 cross join
引入额外的行
SELECT p.weeknum, dateadd(day, n.n, p.date) as date, q.Key, q.ID, q.Score
FROM tblWeeks p cross apply
fnBenchmarkData(p.weeknum) q cross join
(select 0 as n union all select 1 as n union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6
) n;
您可以尝试使用下面的 SQL 脚本,尝试与需求相关.. 请根据您的需要更新脚本
CREATE FUNCTION fnBenchmarkData(@WeekNum INT,@BDate DATETIME,@Score INT)
RETURNS @RtnValue TABLE
(
WeekNum INT,
BDate DATETIME,
Score DATETIME
)
AS
BEGIN
-- NO DATA For Weekend
IF(DatePart(WEEKDAY,@BDate) <> 1 AND DatePart(WEEKDAY,@BDate) <> 7)
BEGIN
INSERT INTO @RtnValue VALUES(@WeekNum,@BDate,@Score)
-- Repeat For Thursday
IF(DatePart(WEEKDAY,@BDate)) =5 --Thu repeat row
BEGIN
INSERT INTO @RtnValue VALUES(@WeekNum,@BDate,@Score)
END
END
RETURN
END
GO
使用脚本评估函数输出
Select * From dbo.fnBenchmarkData(1496,'2015-07-09',1)
Select * From dbo.fnBenchmarkData(1496,'2015-07-08',1)
Select * From dbo.fnBenchmarkData(1496,'2015-07-11',1)
现在按照您在查询中的建议,使用交叉应用并传递预期参数并在 select 命令中使用函数输出。
tblWeeks table 有周数和日期列(仅每周四) 像这样:
WeekNum Date
1496 2015-7-2
1497 2015-7-9
1498 2015-7-16
fnBenchmarkData 函数将 return 基于指定周数参数的每周数据。
我使用交叉应用来显示所有周的基准数据:
SELECT p.weeknum, p.date, q.Key, q.ID, q.Score
FROM tblWeeks AS p
cross apply
fnBenchmarkData(p.weeknum) as q
现在我的问题是,从 function 和 weeknum 生成的分数数据将在每周四更新并保持不变直到下周三,即 周四 - 下周三是 "loop" 并且所有分数数据都相同,weeknum 也相同。但是,该函数仅 return 星期四。
交叉应用只会显示每个星期四的数据,我想显示其余的工作日,基本上复制行但更改日期。
例如,下面是我从交叉应用中得到的:
WeekNum Date Score
1496 2015-7-2 (Thur) 1
1497 2015-7-9 (Thur) 5
1498 2015-7-16(Thur) 7
....
我想要我的交叉应用 SQL return 像这样:
WeekNum Date Score
1496 2015-7-2 (Thur) 1
1496 2015-7-3 1
/* No data stored for weekend
1496 2015-7-6 1
1496 2015-7-7 1
1496 2015-7-8 1
1497 2015-7-9 (Thur) 5
1497 2015-7-10 5
1497 2015-7-13 5
1497 2015-7-14 5
1497 2015-7-15 5
1498 2015-7-16(Thur) 7
有人知道怎么做吗?非常感谢!
我认为最简单的方法是使用 cross join
引入额外的行
SELECT p.weeknum, dateadd(day, n.n, p.date) as date, q.Key, q.ID, q.Score
FROM tblWeeks p cross apply
fnBenchmarkData(p.weeknum) q cross join
(select 0 as n union all select 1 as n union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6
) n;
您可以尝试使用下面的 SQL 脚本,尝试与需求相关.. 请根据您的需要更新脚本
CREATE FUNCTION fnBenchmarkData(@WeekNum INT,@BDate DATETIME,@Score INT)
RETURNS @RtnValue TABLE
(
WeekNum INT,
BDate DATETIME,
Score DATETIME
)
AS
BEGIN
-- NO DATA For Weekend
IF(DatePart(WEEKDAY,@BDate) <> 1 AND DatePart(WEEKDAY,@BDate) <> 7)
BEGIN
INSERT INTO @RtnValue VALUES(@WeekNum,@BDate,@Score)
-- Repeat For Thursday
IF(DatePart(WEEKDAY,@BDate)) =5 --Thu repeat row
BEGIN
INSERT INTO @RtnValue VALUES(@WeekNum,@BDate,@Score)
END
END
RETURN
END
GO
使用脚本评估函数输出
Select * From dbo.fnBenchmarkData(1496,'2015-07-09',1)
Select * From dbo.fnBenchmarkData(1496,'2015-07-08',1)
Select * From dbo.fnBenchmarkData(1496,'2015-07-11',1)
现在按照您在查询中的建议,使用交叉应用并传递预期参数并在 select 命令中使用函数输出。