【问题标题】:Manupilating previous month data according to current month根据当月处理上月数据
【发布时间】:2017-10-26 13:07:18
【问题描述】:

我有一个名为 Prv_Data 的表,其中包含上个月的报告,具有 Report_Id 和 Timeline 列。

Prv_Data -->
Report_ID | Timeline ---------------|-------------- 01 | Weekly @Mon 01 | Weekly @Mon 01 | Weekly @Mon 01 | Weekly @Mon 02 | Weekly @Thru 02 | Weekly @Thru 02 | Weekly @Thru 02 | Weekly @Thru 02 | Weekly @Thru

我有另一个表名为 Cur_Month,其中包含当前月份的详细信息。

Cur_Month-->
Details | Count --------------|-------- First Date | 05/01/2017 Last Date | 05/31/2017 Friday | 4 Monday | 5 Saturday | 4 Sunday | 4 Thursday | 4 Tuesday | 5 Wednesday | 5

现在我想创建一个表名为 Cur_Data ,其中包含报告详细信息,但根据当前月份的工作日计数,意味着上个月的周一计数为 4,周四计数为 5,这就是 Report_ID 1 和 2 出现的原因因为星期一发生了 4 次,星期四发生了 5 次,但是现在在 current_Month 我们有星期一和星期四的发生是 5 和 4(当前月份信息来自 Cur_Month 表),据此我想复制 prv_month 表数据,但根据星期一的发生和星期四 --- Cur_Data

Cur_Data(所需表)-->
Report_ID | Timeline ---------------|-------------- 01 | Weekly @Mon 01 | Weekly @Mon 01 | Weekly @Mon 01 | Weekly @Mon 01 | Weekly @Mon 02 | Weekly @Thru 02 | Weekly @Thru 02 | Weekly @Thru 02 | Weekly @Thru

提前感谢:)

【问题讨论】:

  • 您能否提供示例输入数据和适当的预期输出?
  • Prv_Data 是输入数据,Cur_Data 是预期输出
  • 听起来是个糟糕的设计……你能详细说明原因吗?我假设/希望这些是视图......不是表格。
  • tables 有数百万条记录,所以我说明了它的示例/案例。我可以知道你不能理解什么。表 Prv_Data 是我现有的表,它具有报告 ID 和时间线,report_ID 01 具有星期一时间线,在上个月出现 4 次,Report_ID 02 具有星期四时间线,在上个月出现 5 次。现在我想根据 cur_month 数据根据 Mon 和 Thru 的发生来更改记录。
  • 我在Prv_DataCur_Data 数据之间看到的唯一变化是ReportIDs 的数量不同,您应该更清楚为什么实现所需输出的逻辑。

标签: sql-server date data-manipulation dynamicquery


【解决方案1】:

在我看来,您似乎并没有很好地满足您的要求。

我没有关注任何事情。

我唯一了解的是,您想将 Cur_Month 数据转换为特定格式的 Cur_Data 数据。我不了解背景。

试试这个,然后告诉我,

declare @Prv_Data table(Report_ID int,Timeline varchar(40))
insert into @Prv_Data VALUES
(01,'Weekly @Mon')
,(01,'Weekly @Mon')
,(01,'Weekly @Mon')
,(01,'Weekly @Mon')
,(02,'Weekly @Thru')
,(02,'Weekly @Thru')
,(02,'Weekly @Thru')
,(02,'Weekly @Thru')
,(02,'Weekly @Thru')


declare @Cur_Month table(Details varchar(40),Count varchar(40))
insert into @Cur_Month VALUES
('First Date','05/01/2017')
,('Last Date','05/31/2017')
,('Friday','4')
,('Monday','5')
,('Saturday','4')
,('Sunday','4')
,('Thursday','4')
,('Tuesday','5')
,('Wednesday','5')
;WITH Cur_Data as
(
select *
,case when Details='Monday' then '1' 
when Details='Thursday' then '2'  END ReportID
,case when Details='Monday' then 'Weekly @Mon' 
when Details='Thursday' then 'Weekly @Thru'  END Timeline
  from @Cur_Month
where Details in('Monday','Thursday')
)

select REPLICATE('0',len(ReportID))+  ReportID ReportID
,Timeline from Cur_Data c
cross apply  (select number 
from master..spt_values where number>0 
and number<=c.[count]  and type='LO')cs

【讨论】:

  • 感谢 Harsh 的代码,它提供了所需的输出。但是你能解释一下“master..spt_values”的用法吗,它到底在做什么。我研究了“master..spt_values”并了解到,它是未记录的系统表,使用不安全,因为 Microsoft 可以随时使用。所以,我们有任何替代方案。再次感谢!
猜你喜欢
  • 2013-02-24
  • 2021-11-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2019-05-15
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多