首先,架构和数据布局不受我的控制。如果我对存储有更多的控制权,我会愉快地做出一些调整,但这是我被迫与之合作的。
在我们的数据库中,我们存储了许多因素"对于每个产品交易。这些因素会根据产品类型而有所变化,但经常会重复使用,但不一定按照产品与产品的顺序排列。
我希望希望是可能的(但怀疑它不是大量的动态查询构建)是一种查询事务的方法,只检索那些因素匹配给定的输入。一个可能有帮助的例子:
示例表
ID | ProductID | Factor01 | Value01 | Factor02 | Value02 | .... | Factor15 | Value15
------------------------------------------------------------------------------------
1 | 15 | PROT | 10.1 | MO | 3.0 | .... | |
2 | 16 | MO | 2.8 | DK | 11.6 | .... | |
3 | 17 | MO | 5.6 | PROT | 12.6 | .... | GRN | 0.8
因此,如果我需要查询表格以获取' MO'在每种情况下,我们当前必须查询整个15个值,然后遍历应用程序中的数据以找到正确的值并显示它。
有没有办法让SQL处理这个提升?我们正在开发的程序在处理数据方面并不过分强大,因此通常更容易为其提供返回可以查询的数据的视图。
我可以提供更多详细信息来帮助您吗?我的一部分假设这是不可能的,没有复杂的功能,绝对的开发环境无法处理。
编辑: SQL Server 2012,并且@Higgins请求永远不会超过15个因素,但有些产品可能只使用5个,留下6-15个NULL或空白。
答案 0 :(得分:2)
如果您正在使用SQL2005或更高版本,请使用cross apply和union all:
select t.ID, t.ProductID, fv.Factor, fv.Value, fv.pos
from table t cross apply (
select pos = 1, factor = factor01, value = value01 where factor01 <> ''
UNION ALL select 2, factor02, value02 where factor02 <> ''
UNION ALL select 3, factor03, value03 where factor03 <> ''
...
UNION ALL select 15, factor15, value15 where factor15 <> ''
) fv
它表现得非常好。 UNPIVOT也可以,但IMO更容易理解。