如何从 table 中选取多个值并动态添加它们以选取另一列

How to pick multiple values from the table and add them dynamically for picking another column

SELECT
    AgentID,Seat1,SeatUpdated_1,Seat2,SeatUpdated_2,
    Seat3,SeatUpdated_3,nTimesSeatChanged,
    DATEDIFF(MS,(F.SeatUpdated_1),(F.SeatUpdated_3)) AvgTime
FROM ##final F  

现在我必须根据列 nTimesSeatChangesdiff 函数中选择 SeatUpdated_3

如果任何代理的值为 2,则所选列应为 SeatUpdated_2

从有限的信息中首先看你是如何存储信息的。看起来您正在跨列存储相关值。如果将它们存储为行,使用起来会更简单。

当前:

AgentID Seat1 SeatUpdated_1 Seat2 SeatUpdated_2 Seat3 SeatUpdated_3 nTimesSeatChanged
------- ----- ------------- ----- ------------- ----- ------------- -----------------
1       11                  21    01/02/2015    31    01/03/2015    2

收件人:

TableKey AgentID Seat SeatUpdated
-------- ------- ---- -----------
1        1       11   01/01/2015
2        1       12   01/02/2015
3        1       13   01/03/2015
4        2       22   02/02/2015
5        2       23   02/03/2015

然后进行简单查询以获得最终结果。我无论如何都不是专家,但这就是我的处理方式。

;
--Some sample data
WITH CTE_DATA as
(
SELECT '1' as TableKey, '1' as 'AgentID','11' as'Seat','01/01/2015' as 'SeatUpdated'
UNION
SELECT '2','1','12','01/02/2015'
UNION
SELECT '3','1','13','01/03/2015'
UNION
SELECT '4','2','22','02/02/2015'
UNION
SELECT '5','2','23','02/03/2015'
)
,

--Get Min Seat
    CTE_Min AS (
        SELECT AgentID
            ,MIN(Seat) AS min_seat
        FROM CTE_DATA
        GROUP BY AgentID
        )
--Get max seat
    ,CTE_Max AS (
        SELECT AgentID
            ,MAX(Seat) AS max_seat
        FROM CTE_DATA
        GROUP BY AgentID
        )
--Stick them together
    ,CTE_Join AS (
        SELECT Min.AgentID
            ,Min.min_seat
            ,max.max_seat
        FROM CTE_Min min
        JOIN CTE_Max max ON min.AgentID = max.AgentID
        )
--Get the date
    ,CTE_JoinDate AS (
        SELECT j.*
            ,d1.SeatUpdated AS min_date
            ,d2.SeatUpdated AS max_date
        FROM CTE_Join j
        LEFT JOIN CTE_DATA d1 ON j.AgentID = d1.AgentID
            AND j.min_seat = d1.Seat
        LEFT JOIN CTE_DATA d2 ON j.AgentID = d2.AgentID
            AND j.max_seat = d2.Seat
        )
--Work out nSeats
    ,CTE_nSeats AS (
        SELECT AgentID
            ,COUNT(1) AS nSeats
        FROM CTE_DATA
        GROUP BY AgentID
        )

--Final result set
SELECT j.*
    ,DATEDIFF(DAY, min_date, max_date) AS DIFF_Days
    ,n.nSeats
FROM CTE_JoinDate j
LEFT JOIN CTE_nSeats n ON j.AgentID = n.AgentID