插入时循环/迭代日期范围

D.R*_*.R. 2 sql sql-server triggers

所以我将数据导入到一个表中(让我们称之为RAWDATA),格式如下:

EMPID  | STARTDATE  | ENDDATE    | TOTALHOURS | TOTALWAGES
ABC123 | 01-01-2013 | 01-28-2013 | 160.0      | 1800.00
XYZ987 | 01-01-2013 | 01-31-2013 | 200.0      | 2500.00
Run Code Online (Sandbox Code Playgroud)

我需要获取该数据,并将其放在不同的表(EMPDATA)中,格式如下:

EMPID  | DATE       | HOURS | WAGES
ABC123 | 01-01-2013 | 5.71  | 64.29
ABC123 | 01-02-2013 | 5.71  | 64.29
ABC123 | 01-03-2013 | 5.71  | 64.29
...... | .......... | ....  | .....
XYZ987 | 01-01-2013 | 6.45  | 80.66
XYZ987 | 01-02-2013 | 6.45  | 80.66
XYZ987 | 01-03-2013 | 6.45  | 80.66
...... | .......... | ....  | .....

我的想法是在STARTDATE和ENDDATE之间做一个DATEDIFF来计算多少天(在这种情况下:28)来分散小时和工资,然后在每天插入一行,其中包含每天平均工时和工资.这将通过RAWDATA表上的触发器完成.我只是不确定如何在触发器中从STARTDATE迭代到ENDDATE.

编辑:我还应该声明导入的数据并不总是每行有相同的开始/结束日期.我已经更新了第一个表示例来表明这一点.

Ker*_*mit 5

  1. 创建一个date表并使用一个JOIN.
  2. 计算startdate和之间的天数enddate
  3. 划分totalhourstotalwages按天计算.

这是我的解决方案:

SELECT a.empid, b.dd AS date, 
  CAST(a.totalhours AS decimal) / (DATEDIFF(day, startdate, enddate) + 1) AS hours,
  CAST(a.totalwages AS decimal) / (DATEDIFF(day, startdate, enddate) + 1) AS wages
FROM wages a
INNER JOIN dates b ON dd BETWEEN a.startdate AND a.enddate
Run Code Online (Sandbox Code Playgroud)

结果

|  EMPID |       DATE |         HOURS |          WAGES |
--------------------------------------------------------
| ABC123 | 2013-01-01 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-02 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-03 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-04 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-05 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-06 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-07 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-08 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-09 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-10 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-11 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-12 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-13 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-14 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-15 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-16 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-17 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-18 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-19 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-20 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-21 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-22 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-23 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-24 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-25 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-26 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-27 | 5.71428571428 | 64.28571428571 |
| ABC123 | 2013-01-28 | 5.71428571428 | 64.28571428571 |

看演示

  • @swasheck,sdlect into将无法在触发器中工作,只有在表不存在时才有效.你需要在你的表名和字段的顶部添加插入.这是对的作者,我们不应该为你做你的工作. (3认同)
  • 在开始评论/回答SO之前,我需要喝咖啡 (3认同)
  • @DR取决于你对日期表的具体反对意见? (3认同)
  • @DR日期表真的是你最好的**解决方案.只需在[本文](http://www.sqlperformance.com/2013/01/t-sql-queries/generate-a-set-3)的性能图表中快速登顶. (2认同)