严格来说,对这个问题的SQL答案是“这是一个显示问题。显示是应用程序问题,而不是数据库问题。”从关系角度讲,这也是要求服务器打破第一范式并创建重复组,这意味着它几乎肯定会需要跳过几个环节,并且会有很大的局限性。
的根据DBA“正确的方式”会做这样的事情:
SELECT pid, id, val1, val2, val3
FROM Table
ORDER BY pid, id;
然后,在你的应用程序,走过你的结果集,当你需要它格式化输出。
你甚至可以包括对pid
内的每个id
命令,也许使它更容易一点:
SELECT pid,
id,
val1,
val2,
val3,
ROW_NUMBER() OVER (PARTITION BY pid, ORDER BY id) AS "id_order"
FROM Table
ORDER BY pid, id;
但是,让我们说你不能这样做。
如果你绝对有用SQL做到这一点(例如,您的报告软件不能处理这种事情,这是你要做的),你知道你永远不会有超过3 id
每个pid
,你可以尝试这样的事:
;WITH Table_id_ordered AS (
SELECT pid,
id,
val1,
val2,
val3,
ROW_NUMBER() OVER (PARTITION BY pid, ORDER BY id) AS "id_order"
FROM Table
)
SELECT t1.pid,
t1.id as id_1,
t1.val1 as val1_1,
t1.val2 as val2_1,
t1.val3 as val3_1,
t2.id as id_2,
t2.val1 as val1_2,
t2.val2 as val2_2,
t2.val3 as val3_2,
t3.id as id_3,
t3.val1 as val1_3,
t3.val2 as val2_3,
t3.val3 as val3_3
FROM Table_id_ordered t1
LEFT JOIN Table_id_ordered t2
ON t2.pid = t1.pid
AND t2.id_order = t1.id_order + 1
LEFT JOIN Table_id_ordered t3
ON t3.pid = t2.pid
AND t3.id_order = t2.id_order + 1
WHERE t1.id_order = 1;
显然,这只是对多达三个id
任何pid
好。正如所写的,它也不会告诉你表中的id
是否在第五位或第五位。他们完全没有结果。我提到的第一种方法将始终返回所有数据,并且可以编写应用程序来轻松处理。
对于pid
,可以创建动态解决方案以完成任意数量的id
,但这些要复杂得多。
为什么是第二排的结果呢? – 2015-03-31 15:50:45
@GiorgiNakeuri sry,结果第二排是错误的。 – hunt3r87 2015-04-01 08:54:27