SQL内部联接列表拆分SSRS报告

时间:2015-06-05 11:21:25

标签: sql tsql reporting-services inner-join

我有一个字段列出了产品的所有语言描述,字段可以包含如下数据:
EN; FR; DE

它将始终是一个双字母语言代码,后跟一个半冒号。

然后我有一个存储过程,查找具有特定语言代码的所有产品。简单地完成:

WHERE           
      ext.languages LIKE '%' + @language + '%' 

@language变量可能只代表字母EN,例如。现在,当我想找到一个同时包含法语和英语的产品时,我需要传递FR,EN'对于语言变量。现在我在SQL中有一个自定义函数,它将语言变量分成行,所以我实际上有

第1-EN行第11行 第2-FR行

现在我需要检查我的ext.language字段以查看这两个值是否存在。 我试图这样做:

INNER JOIN MyFunctionsDatabase.dbo.listSplit(@language) as var1
 ON ext.language LIKE '%'+var1.StringLiteral+'%'

这只会带回包含法语或英语的产品我需要它来带回包含英语和法语的值。

非常感谢任何建议:

3 个答案:

答案 0 :(得分:1)

尝试下面的脚本,这是我写的3种语言,但可以完成通用

Declare @Product AS Table(ProductID INT, [Language] Varchar(500))
Insert Into @Product Values(1,'EN;FR;DE'),(2,'EN'),(3,'EN;DE'),(4,'EN;FR')
SELECT * FROM
(
    Select P.ProductID,L.Value 
    From @Product P
    CROSS APPLY dbo.[udfSplit]([Language],';') L
) Product   
PIVOT
(
    Count(Value)
    For Value in (EN,FR,DE)
)
AS PV
Where EN=1 AND FR=1

答案 1 :(得分:0)

我倾向于使用一个函数来接受包含要检查的语言代码的分隔字符串以及要检查的字符串。它检查每个语言代码是否在字符串中,并且一旦找不到所需语言之一就返回false。如果找到所有内容,则返回true。

你的sql看起来像

select *
  from mytable
 where CheckHasAllLanguages(language, @languagesToCheck) = 1

答案 2 :(得分:0)

我会让你的参数成为一个多选,让每个单独的语言成为一个选择。您甚至可以使用数据库中的值提供参数,以便在有新语言时自动更新。我打算调用此参数@LangMultiSelect

由于您只需要与所有选项匹配的项目,您需要在第二个参数中传递已选择的项目数。在数据集的属性中,您可以添加由表达式设置的另一个参数。将其命名为@LangCount并使用表达式:

=Parameters!LangMultiSelect.Count

然后使用类似于此的SQL查询:

SELECT Name
FROM (
    SELECT Name,
        COUNT(*) OVER(PARTITION BY pt.id) AS lCount
    FROM ProductTable AS pt
    INNER JOIN MyFunctionsDatabase.dbo.listSplit(@language) AS var1 ON var1.id=pt.id
    WHERE pt.language IN (@LangMultiSelect)
) AS t
WHERE t.lCount = @LangCount

该查询使用COUNT()聚合作为window function来确定项目所具有的匹配数,然后仅返回与多选参数中的所有选项匹配的结果。

这是有效的,因为我将计数除以一个字段,该字段对于所有项目名称是相同的,但是使用不同的语言。如果你没有这样的领域,那就无法发挥作用。