将2行转换为SQL Server中的字段

时间:2018-03-20 12:11:19

标签: sql-server pivot

在SQL server(2016)中,我想将2行转换为包含两行字段的1行。 我有这个例子:

a

输出:

IF OBJECT_ID('tempdb.dbo.#MyTable') IS not NULL DROP TABLE #MyTable

CREATE TABLE #MyTable (
    Direction varchar(1),
    DateKey int,
    ID varchar(8),
    [Sessions] int
    )

insert into #MyTable values('S', 20180301, 'ID123456', 46)
insert into #MyTable values('R', 20180301, 'ID123456', 99)

select * from #MyTable

我想要的输出是:

Direction   DateKey     ID          Sessions
S           20180301    ID123456    46
R           20180301    ID123456    99

所以我尝试了这个查询,但它不起作用:

DateKey     ID          S_Sessions  R_Sessions
20180301    ID123456    46          99

也许我必须创建一个额外的表,插入direction ='S'的行,然后使用direction ='R'的数据更新记录,但我想知道是否有更好的方法来执行此操作。

4 个答案:

答案 0 :(得分:3)

使用PIVOT

select  *
from    #MyTable
        pivot
        (
            max(Sessions)
            for Direction in ([S], [R])
        ) p

答案 1 :(得分:1)

假设您的表包含"对" S和R你也可以使用自我加入

SELECT s.DateKey , s.ID , s.Sessions S_Sessions , r.Sessions R_Sessions
FROM #MyTable S
JOIN #MyTable R
ON s.ID = r.ID
AND s.DateKey = r.DateKey
WHERE S.Direction = 'S'
AND r.Direction = 'R'

答案 2 :(得分:0)

SQL中的

CASE是一个返回单个值的表达式。它不能像过程语言一样用于控制执行流程。

您可以使用条件聚合

select DateKey, ID,
    max(case Direction when 'S' then [Sessions] end) as S_Sessions,
    max(case Direction when 'R' then [Sessions] end) as R_Sessions       
from #MyTable
group by DateKey, ID

Demo here

答案 3 :(得分:0)

试试吧......对我有用。更多变量更多案例和更多左连接表。

select a.DateKey,a.ID,
    (case a.Direction
    when 'S' then a.Sessions 
    end) as S_Sessions,
    (case b.Direction
    when 'R' then b.Sessions 
    end) as R_Sessions
from mytable as a CROSS JOIN mytable as b ON a.ID=b.ID LIMIT 2,1