SQL - 在日期范围内加入事实和维度数据

时间:2017-03-25 07:10:53

标签: sql-server join date-range

我的sql server数据库中有2个表,我想根据它们的日期范围加入。这个数据是保密的,尽管我要发现数据,但我会尽量保持清晰,所以我希望你对此感到满意。

其中一个表表示交易数据,表示将按月开具发票的某个特定对象的使用情况,请参阅下表预览此表

+------------+------------+------------+------------+------------------+
| Object1 ID | Object2 ID |    tFrom   |     tTo    | Transaction Cost |
+------------+------------+------------+------------+------------------+
|      54324 | AAA        | 01/01/2017 | 01/01/2017 | 15,45 €          |
|      54324 | AAA        | 02/01/2017 | 02/01/2017 | 20,00 €          |
|      54324 | AAA        |            | 15/01/2017 | 3,00 €           |
|      54324 | AAA        |            | 02/02/2017 | 2,00 €           |
|      56767 | BBB        |            | 12/12/2017 | 1,78 €           |
|      34567 | BBB        | 02/01/2017 | 02/01/2017 | 40,00 €          |
|      34567 | BBB        | 04/01/2017 | 04/01/2017 | 30,00 €          |
|      34567 | BBB        |            | 16/01/2017 | 9,00 €           |
|      34567 | BBB        | 31/01/2017 | 31/01/2017 | 45,00 €          |
|      85432 | CCC        | 31/12/2016 | 31/12/2016 | 23,00 €          |
|      85432 | CCC        | 02/01/2017 | 02/01/2017 | 12,00 €          |
+------------+------------+------------+------------+------------------+

正如您所看到的,表中有两个对象 - 这是因为要开票的对象的使用取决于另一个对象,并且每月可以对object1和object2进行不同的分配,尽管对象之间的切换并不频繁。

我的维度表,考虑了3种类型的服务(其中一个女巫在上表中表示)并且拥有多个用户维度(我只代表其中的两个,因此表格不会太大)。这个尺寸可以按月变化。请参阅下表的预览:

+--------------+-----------+------------+------------+------------+------------+------------+------------+
| Service Type | Person ID | Dimension1 | Dimension2 | Object1 ID | Object2 ID |    dFrom    |     dTo     |
+--------------+-----------+------------+------------+------------+------------+------------+------------+
| Service1     |         1 | wer        | errerr     |      54324 | AAA        | 01/12/2016 | 28/02/2017 |
| Service2     |         1 | wer        | errerr     |      54324 | AAA        | 01/12/2016 | 28/02/2017 |
| Service3     |         1 | wer        | errerr     |      54324 | AAA        | 01/12/2016 | 28/02/2017 |
| Service1     |         2 | qerer      | teety      |      56767 | BBB        | 01/11/2016 | 31/12/2017 |
| Service2     |         2 | qerer      | teety      |      56767 | BBB        | 01/11/2016 | 31/12/2017 |
| Service3     |         2 | qerer      | teety      |      56767 | BBB        | 01/11/2016 | 31/12/2017 |
| Service1     |         3 | ghgh       | ryyyrtq    |      34567 | BBB        | 01/01/2017 | 31/12/2100 |
| Service2     |         3 | ghgh       | ryyyrtq    |      34567 | BBB        | 01/01/2017 | 31/12/2100 |
| Service3     |         3 | ghgh       | ryyyrtq    |      34567 | BBB        | 01/01/2017 | 31/12/2100 |
| Service1     |         4 | tyty       | ty         |      85432 | CCC        | 01/12/2016 | 31/12/2100 |
| Service2     |         4 | tyty       | ty         |      85432 | CCC        | 01/12/2016 | 31/12/2100 |
| Service3     |         4 | tyty       | ty         |      85432 | CCC        | 01/12/2016 | 31/12/2100 |
| Service2     |         5 | gjhh       | tytyrtt    |      98988 |            | 01/12/2016 | 31/12/2100 |
| Service3     |         5 | gjhh       | tytyrtt    |      98988 |            | 01/12/2016 | 31/12/2100 |
+--------------+-----------+------------+------------+------------+------------+------------+------------+

这里的目标是将表1中的成本分配给表2中的每个人,如下所示:

+------------+------------+------------+------------+------------------+-----------+------------+------------+
| Object1 ID | Object2 ID |    tFrom   |    tTo     | Transaction Cost | Person ID | Dimension1 | Dimension2 |
+------------+------------+------------+------------+------------------+-----------+------------+------------+
|      54324 | AAA        | 01/01/2017 | 01/01/2017 | 15,45 €          |         1 | wer        | errerr     |
|      54324 | AAA        | 02/01/2017 | 02/01/2017 | 20,00 €          |         1 | wer        | errerr     |
|      54324 | AAA        |            | 15/01/2017 | 3,00 €           |         1 | wer        | errerr     |
|      54324 | AAA        | 02/02/2017 |            | 2,00 €           |         1 | wer        | errerr     |
|      56767 | BBB        |            | 12/12/2017 | 1,78 €           |         2 | qerer      | teety      |
|      34567 | BBB        | 02/01/2017 | 02/01/2017 | 40,00 €          |         3 | ghgh       | ryyyrtq    |
|      34567 | BBB        | 04/01/2017 | 04/01/2017 | 30,00 €          |         3 | ghgh       | ryyyrtq    |
|      34567 | BBB        |            | 16/01/2017 | 9,00 €           |         3 | ghgh       | ryyyrtq    |
|      34567 | BBB        | 31/01/2017 | 31/01/2017 | 45,00 €          |         3 | ghgh       | ryyyrtq    |
|      85432 | CCC        | 31/12/2016 | 31/12/2016 | 23,00 €          |         4 | tyty       | ty         |
|      85432 | CCC        | 02/01/2017 | 02/01/2017 | 12,00 €          |         4 | tyty       | ty         |
+------------+------------+------------+------------+------------------+-----------+------------+------------+

为了尝试自己解决这个问题,我用谷歌搜索了,我发现的最相似的文章是this one,但不幸的是它并不适合我的需要。 我设法基于object1和object2 ID和过滤,维度表,服务类型和日期范围dTo>创建上表的内部联接。 tTo和dFrom< = tTo。从这个内部联接我可以检索到一些不正确的结果,我认为它可能与我定义日期范围过滤器的方式有关。

你们对此有何看法? 我如何加入这些表并产生我在第三个表中显示的结果?

编辑: 我刚刚发现在我的原始表中,在给定的日期中有一些使用object1 ID + Object2 ID标识的事务,这些事务在我的维度表中没有涵盖。示例:假设给定事务对于Object1 ID = 34567并且对象2 ID = BBBB具有tTo = 02-02-2016但是我的维度表具有Object1 ID = 45698并且object2 ID = BBBB dFrom = 10-02-2016且dTo = 05 -06-2016。维度表是一个手动构建在excel文件中的表,我通过SSIS提交给SQL服务器表,它是内部流程成本分配的一部分,非常基础(它所包含的信息并不总是发生的事情。实际上,事务表和维度表之间的匹配必须近似。我已经尝试了这么多个小时,现在已准备好包含所有案例的一些视图,但仍然不成功。我敢肯定这是一个基本的事情我错过了但只是不知道是什么。

感谢您的阅读。 如果您需要更多信息,请告诉我。

0 个答案:

没有答案