【问题标题】:Pivoting the data in a key value pair table透视键值对表中的数据
【发布时间】:2014-03-07 11:39:29
【问题描述】:

我有一个像这样的标准表:

MyKey   MyValue
--------------------------------
Var1    20
Var2    30
Var3    20
Var4    15
Var5    6

我希望它看起来像这样:

Var1        Var2        Var3        Var4
--------------------------------------------
20          30          20          15

数据未分组或计算。到目前为止,我已经找到并尝试了很多东西:

SELECT 
    Var1,
    Var2,
    Var2,
    Var4
FROM 
    (select * 
     from MyTable
    ) T
PIVOT
(
    max(MyValue)
    FOR MyKey in 
    (
        'Var1', 'Var2', 'Var3', 'Var4'
    )
)
as V

这可行,但我得到了多行。

另外,我尝试使用 CASE ... WHEN:

Select MyValue,
 Min(Case MyKey When 'Var1' Then MyKey End) Var1,
 Min(Case MyKey When 'Var2' Then MyKey End) Var2,
 ...
 FROM MyTable
 WHERE MyKey in 
 ('Var1', 'Var2', ...)

这行不通,因为我没有什么可分组的。

我正在尝试做的事情是否可行,如果可以,怎么做?

编辑:

好的,我想我已经确定了导致差异的原因,我已经编辑了 SQL Fiddle。基本上,该表有一个 IDENTITY 列。我没有意识到这会有所不同,但它会做出标记。

【问题讨论】:

  • 能否向标准表和预期数据添加更多数据?
  • 您的数据透视结果与您的预期有何不同?我有replicated your pivot on sql fiddle(尽管有一个小的更正),结果似乎正是你所期望的。
  • 您已经提到 I get multiple rows 但是当我尝试使用提到的输入表运行上述查询时,我没有得到多个值。SQL Fiddle 演示 sqlfiddle.com/#!3/c16b8/4
  • 我正在运行的数据透视表包括表中的每一行。我稍微编辑了我的问题。在上面的示例中 - 枢轴返回 5 行而不是 1 行。
  • 我已经更新了帖子,因为我似乎最初没有提供足够的信息来复制问题。

标签: sql sql-server sql-server-2008-r2 pivot


【解决方案1】:

SQL Fiddle

MS SQL Server 2008 架构设置

CREATE TABLE Table1
    ([pk] [int] IDENTITY(1,1) NOT NULL,
     [MyKey] nvarchar(4) not null, 
     [MyValue] nvarchar(30) not null)
;

INSERT INTO Table1
    ([MyKey], [MyValue])
VALUES
    ('Var1', '20'), ('Var2', '30'),
    ('Var3', '20'), ('Var4', '15'),
    ('Var5', 'aaa')
;

查询 1

SELECT 
    Var1,
    Var2,
    Var3,
    Var4
FROM 
    (select [MyKey], [MyValue]
     from Table1
    ) AS T
PIVOT
(
    max(MyValue)
    FOR MyKey in 
    (
        Var1, Var2, Var3, Var4
    )
)
 AS V

Results

| VAR1 | VAR2 | VAR3 | VAR4 |
|------|------|------|------|
|   20 |   30 |   20 |   15 |

【讨论】:

  • 这确实有效(就像我最初的枢轴示例一样)。我更新了帖子以突出显示我看到问题的原因。
  • 查看我的编辑我已经更新了答案。如果它有帮助,请接受答案谢谢。
  • 好像没有。 SQL Fiddle 示例不包含 ID 列
  • @pm_2 您正在执行“SELECT * from Table”,其中包括 Identity 列,请参阅此 SQL FIDDLE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多