SQL Server:从子查询中调出列
Posted
技术标签:
【中文标题】SQL Server:从子查询中调出列【英文标题】:SQL Server : bring up columns from a sub query 【发布时间】:2014-09-17 14:57:01 【问题描述】:我非常坚持这一点(SQL Server 2008 R2)。
我有一个名为 orders 的表:
Orders
:
orderid details
--------------------
1 my order
然后我有一个自定义字段表。
Custom_fields
:
rel_orderid fieldname numericvalue textvalue datevalue
-----------------------------------------------------------
1 auction 0 My auction
1 date 0 01/01/2014
我正在努力
orderid details auction date (on one row)
-------------------------------------------------
1 my order my auction 01/01/2014
希望这是有道理的,但我不知道如何将 custom_fields
表包装到列标题中,然后只有 1 个值(可以是文本值或日期等 - 只有 1 个有数据)
拍卖和日期并从字段名列读取,然后是每个字段的值。
【问题讨论】:
【参考方案1】:您可以为此使用max
和case
:
select o.orderid,
o.details,
max(case when c.fieldname = 'auction' then textvalue end) auction,
max(case when c.fieldname = 'date ' then datevalue end) datevalue
from orders o
join custom_fields c on o.orderid = c.rel_orderid
group by o.orderid
【讨论】:
【参考方案2】:在这种情况下您可以 PIVOT。
select orderid,
details,
[auction],
[date]
FROM
(
select rel_orderid as orderid,
o.details,
fieldname,
(case when fieldname = 'auction'
then textvalue
when fieldname ='date'
then cast(datevalue AS varchar(128))
end) value
FROM custom_fields
INNER JOIN orders o
on o.orderid = rel_orderid
) As OrderDetails
PIVOT
(
max(value)
for fieldname in ([auction],[date])
) pvt
【讨论】:
【参考方案3】:如果你想避免聚合,你可以使用连接来做到这一点:
select o.orderid, o.details, a.textvalue as auction, d.datevalue as dateval
from orders o left join
custom_fields a
on a.rel_orderid = o.orderid and a.fieldname = 'auction' left join
custom_fields d
on d.rel_orderid = o.orderid and d.fieldname = 'date';
即使没有匹配,left join
也会给出一个值 (NULL
)。
【讨论】:
以上是关于SQL Server:从子查询中调出列的主要内容,如果未能解决你的问题,请参考以下文章