【问题标题】:SQL Server : bring up columns from a sub querySQL Server:从子查询中调出列
【发布时间】: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 个有数据)

拍卖和日期并从字段名列读取,然后是每个字段的值。

【问题讨论】:

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


    【解决方案1】:

    您可以为此使用maxcase

    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)。

        【讨论】:

          猜你喜欢
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-17
          • 2018-08-14
          • 1970-01-01
          相关资源
          最近更新 更多