2015-06-10 58 views
0

我需要允许在值全部为CSV的列上进行多重选择。我一直在使用LIKE语句和一个选择参数,但我需要参数来允许多选。一个想法我是为每个参数值创建列(只有6个),然后使用一个CASE声明将它们设置为真/假,然后我就在想,如果选择Type A,那么它会看ColumnA和如果他们也选择Type B那么它也会看ColumnB如何在SSRS中使用新列实现多重选择

整个查询是非常大的,但这里是我的工作

CASE WHEN T1.Types LIKE '%Type A%' THEN 1 ELSE 0 END AS TypeA 

这是一个CTE的摘录,在我最后的SELECT语句其只引用TypeA,等最后的查询应该是像这样的东西

SELECT ID, Types, TypeA, TypeB, TypeC 
FROM TableA 
WHERE Types IN [parameter] 

下面是类型列的一些示例数据。

|________Types________| 
|  TypeA  | 
|  TypeA, TypeC | 
| TypeA, TypeB, TypeC | 

我该如何在不使这个过于复杂的情况下工作?我知道如果我想为每个类型使用6个不同的参数,然后每个参数都有一个True/False,但是我怎样才能使它成为多参数单参数?

+0

如果您想让这项工作不会变得复杂,请将您的数据标准化。 –

回答

0

如果你只有6种,你可以在做这样的事情你的最终选择:

SELECT DISTINCT TableA.* 
FROM TableA 
JOIN 
    (
    Select '%Type A%' TypeCode where @TypeCSVParameter like '%Type A%' 
    union all 
    select '%Type B%' TypeCode where @TypeCSVParameter like '%Type B%' 
    union all 
    select '%Type C%' TypeCode where @TypeCSVParameter like '%Type C%' 
    union all 
    select '%Type D%' TypeCode where @TypeCSVParameter like '%Type D%' 
    union all 
    select '%Type E%' TypeCode where @TypeCSVParameter like '%Type E%' 
    union all 
    select '%Type F%' TypeCode where @TypeCSVParameter like '%Type F%' 
    ) ValidTypes 
on TableA.Types like TypeCode 

另一种方式,你可以做到这一点,而不是这个硬编码列表使用函数来分析您的CSV列表,在这个问题上SSRS multi-value parameter using a stored procedure

我与标签Allerman的评论协议是建议,虽然,你真的应该重新构建数据库。列出一个列表会让事情变得困难。您可能应该有一个包含所有有效类型的TypeCode表,以及一个将Table1.ID链接到适用的TypeCode的关系表。这样你可以避免硬编码这样的特殊情况,并且可以更容易地添加或更改类型。

相关问题