根据值查询许多列中的一列

时间:2014-08-13 16:27:13

标签: sql tsql sql-server-2012

首先,架构和数据布局不受我的控制。如果我对存储有更多的控制权,我会愉快地做出一些调整,但这是我被迫与之合作的。

在我们的数据库中,我们存储了许多因素"对于每个产品交易。这些因素会根据产品类型而有所变化,但经常会重复使用,但不一定按照产品与产品的顺序排列。

我希望希望是可能的(但怀疑它不是大量的动态查询构建)是一种查询事务的方法,只检索那些因素匹配给定的输入。一个可能有帮助的例子:

示例表

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或空白。

1 个答案:

答案 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更容易理解。