-1

我的表目前包含:

blog | id | attribute | value
p    | 1  |  pid      | abc1
p    | 1  |  date     | abc2
p    | 1  |  title    | abc3
p    | 2  |  id       | abc1
p    | 2  |  date     | abc2
p    | 2  |  title    | abc3
p    | 3  |  id       | abc1
p    | 3  |  date     | abc2
p    | 3  |  title    | abc3

我需要将其更改为:

blog | id | postid | date | title
p    | 1  | abc1   | abc2 | abc3
p    | 2  | abc1   | abc2 | abc3
p    | 3  | abc1   | abc2 | abc3

在 sql 中执行此操作的最佳方法是什么?

4

1 回答 1

1

您没有指定您使用的是什么 RDBMS,但这适用于所有版本:

select blog,
  id,
  max(case when attribute = 'pid' then value end) postid,
  max(case when attribute = 'date' then value end) date,
  max(case when attribute = 'title' then value end) title
from yourtable
group by blog, id

请参阅带有演示的 SQL Fiddle

如果您正在使用具有该PIVOT功能的数据库,那么您的查询将如下所示:

select blog, id, pid as postid, date, title
from 
(
  select blog, id, attribute, value
  from yourtable
) src
pivot
(
  max(value)
  for attribute in (pid, date, title)
) piv

请参阅带有演示的 SQL Fiddle

两者的结果将是:

| BLOG | ID | POSTID | DATE | TITLE |
-------------------------------------
|    p |  1 |   abc1 | abc2 |  abc3 |
|    p |  2 |   abc1 | abc2 |  abc3 |
|    p |  3 |   abc1 | abc2 |  abc3 |
于 2013-01-04T15:08:49.473 回答