我需要您的帮助才能获得SQL查询。
我有一个表格“ order”,其中包含订单详细信息。另外,我们还有一个附加表“ ExtraFields”。它包含一些某些客户要使用订单填充的额外字段的名称。 ColumnName就像ID,ClientId,ColumnName ...
现在我们还有另一个表'ExtraFieldValues'(OrderId,ExtraFieldId,Value ....)。它具有任何特定顺序的Extrafield的实际值。
不同的客户具有不同的ExtraField,例如:Notes,“原因”,“其他要求”等。
现在,我需要查询返回记录以获取订单详细信息,包括这些额外字段(作为列名)和值(作为单行记录)。
表看起来像(为了简单起见,我删除了一些列)
订单表:
ExtraField表:
ExtraFieldValue表:
查询将针对每个客户端运行,因此,如果运行查询以获取客户端98963的订单,则其外观应为
我对这个sql很陌生,任何指针都会有所帮助。
谢谢
答案 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)