SQL查询,从一个表中获取列名值,从另一个表中获取记录值?

SQL查询,从一个表中获取列名值,从另一个表中获取记录值?,sql,sql-server,Sql,Sql Server,我需要您的帮助来获取SQL查询 我有一个表“订单”,其中包含订单详细信息。此外,我们还有一个附加表“ExtraFields”。这包含一些客户机希望使用订单填充的额外字段的名称。列名称类似于Id、ClientId、ColumnName 现在我们还有另一个表“ExtraFieldValues”(OrderId、ExtraFieldId、Value…)。这具有任何特定顺序的外部字段的实际值 不同的客户机有不同的外部字段,如:备注、'Reason'、'Additional Req'等 现在,我需要得到一

我需要您的帮助来获取SQL查询

我有一个表“订单”,其中包含订单详细信息。此外,我们还有一个附加表“ExtraFields”。这包含一些客户机希望使用订单填充的额外字段的名称。列名称类似于Id、ClientId、ColumnName

现在我们还有另一个表“ExtraFieldValues”(OrderId、ExtraFieldId、Value…)。这具有任何特定顺序的外部字段的实际值

不同的客户机有不同的外部字段,如:备注、'Reason'、'Additional Req'等

现在,我需要得到一个查询,以返回订单详细信息的记录,包括这些作为列名的外部字段和作为单行记录的值

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

订单表:

外场表:

ExtraFieldValue表:

查询将针对每个客户机运行,因此如果运行查询以获取客户机98963的订单,它应该如下所示

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


谢谢

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

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;

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

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

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;

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

最终在PIVOT中找到了我的答案。这可能不是最好的方法,但却能满足我的需要。

这是我为任何有类似问题的人提出的问题

必须首先从extrafield表中获取所有不同的列名称,然后对所需的查询应用pivot

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)

终于在PIVOT中找到了我的答案。这可能不是最好的方法,但却能满足我的需要。

这是我为任何有类似问题的人提出的问题

必须首先从extrafield表中获取所有不同的列名称,然后对所需的查询应用pivot

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)

请分享这三个表格的样本数据和期望的结果。这里的关系很难理解。我添加了一些示例数据,希望这有助于更好地理解我的问题。请分享这三个表的示例数据和期望的结果。这里的关系很难理解。我添加了一些示例数据,希望这有助于更好地理解我的问题。