如何将重复排名(1-5)行数据转换为TSQL中的列数据

时间:2016-01-16 05:49:29

标签: sql sql-server tsql

我有一个表数据:

ID      Sale    Weekday
1       12      1
2       15      2
3       16      3
4       17      4
5       18      5
6       11      1
7       13      2
8       14      3
9       15      4
10      20      5
11      25      1
12      14      2
13      18      3
14      21      4
15      11      5
..      ..

我想把它变成:

Mo   Tu   We   Th   Fr
12   15   16   17   18
11   13   14   15   20
25   14   18   21   11
..

谢谢!

2 个答案:

答案 0 :(得分:0)

试试这个

SELECT SUM(case when Weekday = 1 then Sale else 0 end) as mn,
       SUM(case when Weekday = 2 then Sale else 0 end) as Tu,
       SUM(case when Weekday = 3 then Sale else 0 end) as We,
       SUM(case when Weekday = 4 then Sale else 0 end) as Th,
       SUM(case when Weekday = 5 then Sale else 0 end) as Fr
FROM
(
    SELECT *,
          Row_number()OVER(partition by weekday ORDER BY ID ) as seq_no
    FROM   tablename
) A
Group by seq_no

如示例数据中所述,如果您的表格全周都有5天

SELECT SUM(case when Weekday = 1 then Sale else 0 end) as mn,
       SUM(case when Weekday = 2 then Sale else 0 end) as Tu,
       SUM(case when Weekday = 3 then Sale else 0 end) as We,
       SUM(case when Weekday = 4 then Sale else 0 end) as Th,
       SUM(case when Weekday = 5 then Sale else 0 end) as Fr
FROM
(
    SELECT *,
          ( ( Row_number()OVER(ORDER BY ID ) - 1 ) / 5 ) + 1 seq_no
    FROM   tablename
) A
Group by seq_no

答案 1 :(得分:0)

您可以将pivot运算符与分区row_number一起使用,如下所示:

select
    max([1]) as 'Mo',
    max([2]) as 'Tu',
    max([3]) as 'We',
    max([4]) as 'Th',
    max([5]) as 'Fr' 
from 
(
    select *, row_number() over (partition by weekday order by id) rn 
    from your_table
) a
pivot (max(sale) for weekday in ([1],[2],[3],[4],[5])) p
group by rn;