将多行转换为具有特定列名的列

时间:2019-03-29 17:39:40

标签: sql sql-server pivot

我有几个项目要在不同的日期/时间定期发布(I-UN)和浪费(W-WS)。我要每次都保留一个事务时间(W-WS减去I-UN),因此要完成该任务,我需要在单独的列中输入I-UN日期和W-WS。

以下是我所拥有的:

    ItemID  Type    Date
    441455  I-UN    3/24/19 8:00
    441455  W-WS    3/24/19 8:09
    441455  I-UN    3/24/19 9:47
    441455  W-WS    3/24/19 9:51
    441455  I-UN    3/24/19 12:20
    441455  W-WS    3/24/19 12:26
    441455  I-UN    3/24/19 15:50
    441455  W-WS    3/24/19 15:53

以下是我要实现的目标:

    ItemID  I-UN Date       W-WS Date
    441455  3/24/19 8:00    3/24/19 8:09
    441455  3/24/19 9:47    3/24/19 9:51
    441455  3/24/19 12:20   3/24/19 12:26
    441455  3/24/19 15:50   3/24/19 15:53

有没有一种方法可以查询以获得所需的结果?对你的帮助表示感谢。谢谢!

2 个答案:

答案 0 :(得分:0)

对表进行自连接,左侧为I-UN行,右侧为TOP 1 W-WS行,其中Date为右侧>左侧的Date

作为自联接的替代方法,您只需在FROM..WHERE子句中选择I-UN行,然后通过子查询获取W-WS Date

答案 1 :(得分:0)

您可以尝试按时间顺序对商品ID和row_number()进行完全联接。

SELECT t1.itemid [ItemID],
       t1.date [I-UN Date],
       t2.date [W-WS Date]
       FROM (SELECT itemid,
                    date,
                    row_number() OVER (ORDER BY date) r#
                    FROM elbat
                    WHERE type = 'I-UN') t1
            FULL JOIN (SELECT itemid,
                              date,
                              row_number() OVER (ORDER BY date) r#
                              FROM elbat
                              WHERE type = 'W-WS') t2
                      ON t1.itemid = t2.itemid
                         AND t1.r# = t2.r#;

db<>fiddle

或者,如果您只希望同时存在两个对的对,则可能是一个内部联接(或者,如果只想确保其中的所有时间都被占用,则为左联接或右联接)。

相关问题