sql - 将具有日期范围的两张表合并为一张表

标签 sql sql-server

作为对电信数据计费工作的一部分,我从各种来源收集数据以构建准确的成本核算系统。目前,一个表从监管电子表格中获取数据,另一个从各种定价表中获取数据——这些数据以电话号码范围为键,例如

Table 1  (Range, Provider, Status, Valid From, Valid To)
'0113', 'BT', 'Allocated', '2018-01-01 00:00:00', '2018-07-14 23:59:59'
'0113', 'BT2', 'Allocated', '2018-07-15 00:00:00', '2299-12-31 23:59:59'

Table 2  (Range, Price Band, Valid From, Valid To)
'0113', 'Price1', '2018-01-01 00:00:00', '2018-06-30 23:59:59'
'0113', 'Price2', '2018-07-01 00:00:00', '2299-12-31 23:59:59'

Output Table
'0113', 'BT', 'Allocated', 'Price1', '2018-01-01 00:00:00', '2018-06-30 23:59:59'
'0113', 'BT', 'Allocated', 'Price2', '2018-07-01 00:00:00', '2018-07-14 23:59:59'
'0113', 'BT2', 'Allocated', 'Price2', '2018-07-15 00:00:00', '2299-12-31 23:59:59'

现在,我可以通过游标遍历第一个表然后从第二个表中选择记录并根据日期范围彼此重叠的方式输出一系列行来做到这一点,但是有没有一种简单的方法可以使用SQL 语句和一些连接?

最佳答案

您可以尝试使用 JOIN on during date 和 CASE WHEN 判断 SELECT 子句中的日期。

SELECT T1.Range,
      T1.Provider,
      T1.Status, 
      T2.[Price Band],
      CASE WHEN T1.[Valid From] >= T2.[Valid From] THEN T1.[Valid From]
           ELSE T2.[Valid From] END,
      CASE WHEN T1.[Valid To] <= T2.[Valid To] THEN T1.[Valid To]
           ELSE T2.[Valid To] END
FROM T1 INNER JOIN T2 on 
(
    T1.[Valid From] between T2.[Valid From] and T2.[Valid To] 
OR
    T1.[Valid To] between T2.[Valid From] and T2.[Valid To]
) 
AND 
   T1.Range =T2.Range

sqlfiddle

[结果] :
| Range | Provider |    Status | Price Band |           Valid From |             Valid To |
|-------|----------|-----------|------------|----------------------|----------------------|
|  0113 |       BT | Allocated |     Price1 | 2018-01-01T00:00:00Z | 2018-06-30T23:59:59Z |
|  0113 |       BT | Allocated |     Price2 | 2018-07-01T00:00:00Z | 2018-07-14T23:59:59Z |
|  0113 |      BT2 | Allocated |     Price2 | 2018-07-15T00:00:00Z | 2299-12-31T23:59:59Z |

关于sql - 将具有日期范围的两张表合并为一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51642477/

相关文章:

sql-server - 如何在 SQL Server 中加密函数

sql - 如果我更新 View ,我的原始表会更新吗

c# - 测试表是否至少有特定的存储过程,否则测试失败 c#

c# - 删除 Oracle 中不存在的记录是否被认为是错误的形式?

mysql - 在格式化 MySQL 查询以返回信息方面需要一些帮助

SQL - 如何通过连接将不同表中的 2 个日期合并在一起而不会出现错误

sql - 在 SQL Server 中检索具有相同前缀的所有 XML 元素

sql-server - 无法在亚马逊 linux 实例上安装 sql server - 需要 : systemd-units systemd and numactl-libs

sql - 在 MySQL 中,这两种连接表方法有何优缺点?

mysql - 使用同一表中的数据更新表(移动平均值)