将一个 table 中的值视为另一个中的列 header

Considering values from one table as column header in another

我有一个基础 table,我需要根据条目的类型计算两个日期之间的差异。

tblA

+----------+------------+---------------+--------------+
| TypeCode |  Log_Date  | Complete_Date | Pending_Date |
+----------+------------+---------------+--------------+
|        1 | 18/04/2016 | 19/04/2016    |              |
|        2 | 10/04/2016 | 18/04/2016    | 15/04/2016   |
|        3 | 12/04/2016 | 19/04/2016    |              |
|        4 | 15/04/2016 | 17/04/2016    | 16/04/2016   |
|        5 | 16/04/2016 | 21/04/2016    |              |
|        1 | 19/04/2016 | 20/04/2016    |              |
|        2 | 20/03/2016 | 31/03/2015    |              |
|        3 | 25/03/2016 | 28/03/2016    |              |
|        4 | 26/03/2016 | 27/03/2016    |              |
|        5 | 27/03/2016 | 30/03/2016    |              |
+----------+------------+---------------+--------------+

我又查找了 table,其中包含要根据 TypeCode 考虑的列名。

tblB

+----------+----------+---------------+
| TypeCode | DateCol1 |   DateCol2    |
+----------+----------+---------------+
|        1 | Log_Date | Complete_Date |
|        2 | Log_Date | Pending_Date  |
|        3 | Log_Date | Complete_Date |
|        4 | Log_Date | Pending_Date  |
|        5 | Log_Date | Complete_Date |
+----------+----------+---------------+

我在两个日期之间做一个简单的 DATEDIFF 计算。但是我想从 tblB 中查找此计算要考虑的列,并根据 TypeCode.

将其应用于 tblA

结果table:

例如:当TypeCode24则计算应为DATEDIFF(d, Log_Date, Pending_Date),否则为DATEDIFF(d, Log_Date, Complete_Date)

+----------+------------+---------------+--------------+----------+
| TypeCode |  Log_Date  | Complete_Date | Pending_Date | Cal_Days |
+----------+------------+---------------+--------------+----------+
|        1 | 18/04/2016 | 19/04/2016    |              |        1 |
|        2 | 10/04/2016 | 18/04/2016    | 15/04/2016   |        5 |
|        3 | 12/04/2016 | 19/04/2016    |              |        7 |
|        4 | 15/04/2016 | 17/04/2016    | 16/04/2016   |        1 |
|        5 | 16/04/2016 | 21/04/2016    |              |        5 |
|        1 | 19/04/2016 | 20/04/2016    |              |        1 |
|        2 | 20/03/2016 | 31/03/2015    |              |          |
|        3 | 25/03/2016 | 28/03/2016    |              |        3 |
|        4 | 26/03/2016 | 27/03/2016    |              |          |
|        5 | 27/03/2016 | 30/03/2016    |              |        3 |
+----------+------------+---------------+--------------+----------+

如有任何帮助,我们将不胜感激。谢谢。

使用 JOINCASE 表达式:

SELECT
    a.*,
    Cal_Days =  
        DATEDIFF(
            DAY,
            CASE 
                WHEN b.DateCol1 = 'Log_Date' THEN a.Log_Date
                WHEN b.DateCol1 = 'Complete_Date' THEN a.Complete_Date
                ELSE a.Pending_Date
            END,
            CASE 
                WHEN b.DateCol2 = 'Log_Date' THEN a.Log_Date
                WHEN b.DateCol2 = 'Complete_Date' THEN a.Complete_Date
                ELSE a.Pending_Date
            END
        )
FROM TblA a
INNER JOIN TblB b
    ON b.TypeCode = a.TypeCode