SQL查询,以按行客户订购日期获取下一行的列为行的列,列的第二行为下一行

时间:2017-06-19 22:28:02

标签: sql sql-server sql-server-2008

我想编写一个SQL查询,以使下一行的列成为一行的列。测试示例如下

enter image description here

我想获取SQL查询以获得如下结果: enter image description here

1 个答案:

答案 0 :(得分:0)

在较新版本的SQL Server中,您可以使用LEAD()窗口功能,但在2012年之前,我认为最简单的方法是使用外部适用:

DECLARE @T TABLE (Customer CHAR(1), [Date] DATE, Item VARCHAR(10));

INSERT @T VALUES
('A', '2016-01-01', 'Pen A'),
('A', '2016-01-05', 'Pen B'),
('A', '2016-01-06', 'Pen C'),
('A', '2016-01-07', 'Pen D'),
('B', '2016-01-01', 'Pen A'),
('B', '2016-01-05', 'Pen B'),
('B', '2016-01-06', 'Pen C'),
('B', '2016-01-07', 'Pen IS');

SELECT T.Customer,
       T.FirstOrderedDate,
       T.FirstOrderedItem,
       T.SecondOrderedDate,
       T.SecondOrderedItem,
       ThirdOrderedDate = T3.[Date],
       ThirdOrderedItem = T3.Item
FROM
(
    SELECT T1.Customer,
           FirstOrderedDate = T1.[Date],
           FirstOrderedItem = T1.Item,
           SecondOrderedDate = T2.[Date],
           SecondOrderedItem = T2.Item
    FROM @T AS T1
    OUTER APPLY
    (
        SELECT TOP 1 T2.Customer, T2.[Date], T2.Item
        FROM @T AS T2
        WHERE T2.Customer = T1.Customer
        AND T2.[Date] > T1.[Date]
        ORDER BY T2.[Date]
    ) AS T2
) AS T
OUTER APPLY
(
    SELECT TOP 1 T3.Customer, T3.[Date], T3.Item
    FROM @T AS T3
    WHERE T3.Customer = T.Customer
    AND T3.[Date] > T.SecondOrderedDate
    ORDER BY T3.[Date]
) AS T3;

注意:由于您没有真正说明客户在同一天订购不同商品的任何细节,我只是假设每个客户在指定日期只订购了一件商品,但如果不是这样的话,那么你必须稍微调整查询逻辑。