【问题标题】:How to convert the table rows in form of columns in SQL如何在SQL中将表格行转换为列的形式
【发布时间】:2015-02-25 14:10:23
【问题描述】:

您好,我有两个表,我想生成所有行都在一行中的报告。

tbl_Questions:

Id  Name
---------
1   Abc
2   Cde
3   xyz
4   MMM

tbl_Reponses:

Id  QuestionId   Values
------------------------
1      1           123
2      2           456
3      3           444

现在我想得到一个查询,它会在某个时候显示这样的结果。

Id Abc Cde xyz MMM
-------------------
1  123 456 444 

我怎样才能通过查询得到这个?

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

使用分组方式

select 
ID
, MIN(CASE WHEN A.NAME ='ABC'
THEN B.VALUES
END) ABC
, MIN(CASE WHEN A.NAME ='cde'
THEN B.VALUES
END) cde
, MIN(CASE WHEN A.NAME ='xyz'
THEN B.VALUES
END) xyz
, ISNULL(MIN(CASE WHEN A.NAME ='mmm'
THEN B.VALUES
END),'') mmm
FROM
tbl_Questions A
inner join tbl_Reponses B
on A.ID=B.ID
group by A.ID

【讨论】:

  • 行数不是静态的,可以增加
  • 不幸的是,使用这种方法,您需要事先了解您的行以了解案例逻辑...
  • 在这种情况下,您需要带有动态列的 PIVOT。stackoverflow.com/questions/10404348/…
【解决方案2】:

使用PIVOT 来做到这一点:

SELECT ROW_NUMBER() OVER(ORDER BY [Abc])Id,* FROM
(
SELECT Name,Value FROM tbl_Questions A LEFT JOIN tbl_Reponses B ON A.Id=B.Id
) AS tbl
PIVOT(SUM(Value) FOR Name IN([Abc],[Cde],[xyz],[MMM]))AS pvt

或者CrossTab方法

SELECT
    ROW_NUMBER() OVER (ORDER BY MAX(A.Id))Id,
    [Abc] = MAX(CASE WHEN Name = 'Abc' THEN Value END),
    [Cde] = MAX(CASE WHEN Name = 'Cde' THEN Value END),
    [xyz] = MAX(CASE WHEN Name = 'xyz' THEN Value END),
    [MMM] = MAX(CASE WHEN Name = 'xyz' THEN Value END)
FROM tbl_Questions A LEFT JOIN tbl_Reponses B ON A.Id=B.Id

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 2022-01-22
    • 1970-01-01
    • 2012-11-09
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多