SQL查询从一个表中获取值作为columnName并记录另一表中的值?

时间:2019-02-11 13:59:05

标签: sql sql-server

我需要您的帮助才能获得SQL查询。

我有一个表格“ order”,其中包含订单详细信息。另外,我们还有一个附加表“ ExtraFields”。它包含一些某些客户要使用订单填充的额外字段的名称。 ColumnName就像ID,ClientId,ColumnName ...

现在我们还有另一个表'ExtraFieldValues'(OrderId,ExtraFieldId,Value ....)。它具有任何特定顺序的Extrafield的实际值。

不同的客户具有不同的ExtraField,例如:Notes,“原因”,“其他要求”等。

现在,我需要查询返回记录以获取订单详细信息,包括这些额外字段(作为列名)和值(作为单行记录)。

表看起来像(为了简单起见,我删除了一些列)

订单表:

enter image description here

ExtraField表:

enter image description here

ExtraFieldValue表:

enter image description here

查询将针对每个客户端运行,因此,如果运行查询以获取客户端98963的订单,则其外观应为

enter image description here

我对这个sql很陌生,任何指针都会有所帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

键/值表很麻烦。如果您知道要选择哪些额外的列,请使用相关的子查询:

select
  o.description,
  o.createdate,
  (
    select efv.value
    from extrafieldvalue efv
    where efv.orderid = o.id 
    and efv.extrafieldid = (select id from extrafield where columnname = 'AdditionalInfo')
  ) as additionalinfo,
  (
    select efv.value
    from extrafieldvalue efv
    where efv.orderid = o.id 
    and efv.extrafieldid = (select id from extrafield where columnname = 'Notes')
  ) as notes
from orders o;

如果您不知道要选择哪些额外的列,请选择所有内容,然后使用应用程序或网页的编程语言来找出要显示的列。

答案 1 :(得分:0)

最后在PIVOT中找到了我的答案。可能不是最好的方法,但是可以按我需要的方式工作。 https://www.essentialsql.com/create-dynamic-pivot-table-sql-server/

这是我针对有类似问题的任何人所做的查询

必须首先从Extrafield表中获取所有不同的columName,然后将数据透视表应用于所需的查询。

DECLARE 
        @Columns as VARCHAR(MAX),
        @SQL as VARCHAR(MAX)

        SELECT @Columns =
        COALESCE(@Columns + ', ','') + QUOTENAME(Name)
        FROM
           (SELECT DISTINCT Name
            FROM   ExtraField
              where ClientId=@CompanyID
           ) AS F
        ORDER BY F.Name

    SET @SQL = 'SELECT RequestedDate,Description, ' + @Columns + '
    FROM
    (
     SELECT order.Created as RequestedDate,
            order.Description as Description,
             ExtraFieldValue.value AS Value,
            ExtraField.Name as Name
     FROM   
        order
        left join ExtraFieldValue on  ExtraFieldValue.OderID=Order.ID 
        left JOIN ExtraField  ON ExtraField.Id = ExtraFieldValue.ExtraFieldID 

    ) as PivotData
    PIVOT
    (
       Max(Value)
       FOR Name IN (' + @Columns + ')
    ) AS PivotResult'

    exec(@sql)