SQL SSRS 报告的内部连接列表拆分
SQL inner join list split for an SSRS report
我有一个字段列出了产品的所有语言描述,该字段可以包含如下数据:
英语;法语;德语
它始终是两个字母的语言代码,后跟一个分号。
然后我有一个存储过程,用于查找具有特定语言代码的所有产品。只需完成:
WHERE
ext.languages LIKE '%' + @language + '%'
例如,@language 变量可能只表示字母 EN。现在,当我想找到同时具有法语和英语语言的产品时,我需要为语言变量传入 'FR, EN'。现在我在 SQL 中有一个自定义函数,它将语言变量拆分成行,这样我就可以有效地拥有
第 1 行-EN
第 2-FR
行
现在我需要检查我的 ext.language 字段以查看这两个值是否都存在。
我尝试过:
INNER JOIN MyFunctionsDatabase.dbo.listSplit(@language) as var1
ON ext.language LIKE '%'+var1.StringLiteral+'%'
这只会带回包含法语或英语的产品我需要它带回包含英语和法语的值。
如有任何建议,我们将不胜感激:
我倾向于使用接受分隔字符串的函数,该字符串包含要检查的语言代码和要检查的字符串。它会检查每个语言代码是否在字符串中,一旦找不到所需的语言之一,它就会检查 returns false。如果找到所有内容,则 returns 为真。
你的sql看起来像
select *
from mytable
where CheckHasAllLanguages(language, @languagesToCheck) = 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
我会让你的参数成为一个多 select 并且让每个单独的语言成为一个 selection。您甚至可以为参数提供数据库中的值,以便在出现新语言时自动更新。我将调用此参数 @LangMultiSelect
由于您只需要与所有 select 离子匹配的项目,因此您需要传入第二个参数,其中包含已 selected 的项目数。在数据集的属性中,您可以添加另一个由表达式设置的参数。将其命名为 @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 来确定项目具有的匹配数,然后只有 returns 个匹配所有 select 的结果multi-select参数中的离子。
之所以有效,是因为我将计数拆分为一个字段,该字段对于所有相同项目但使用不同语言的项目名称都是相同的。如果您没有这样的字段,这将不起作用。
我有一个字段列出了产品的所有语言描述,该字段可以包含如下数据:
英语;法语;德语
它始终是两个字母的语言代码,后跟一个分号。
然后我有一个存储过程,用于查找具有特定语言代码的所有产品。只需完成:
WHERE
ext.languages LIKE '%' + @language + '%'
例如,@language 变量可能只表示字母 EN。现在,当我想找到同时具有法语和英语语言的产品时,我需要为语言变量传入 'FR, EN'。现在我在 SQL 中有一个自定义函数,它将语言变量拆分成行,这样我就可以有效地拥有
第 1 行-EN
第 2-FR
现在我需要检查我的 ext.language 字段以查看这两个值是否都存在。 我尝试过:
INNER JOIN MyFunctionsDatabase.dbo.listSplit(@language) as var1
ON ext.language LIKE '%'+var1.StringLiteral+'%'
这只会带回包含法语或英语的产品我需要它带回包含英语和法语的值。
如有任何建议,我们将不胜感激:
我倾向于使用接受分隔字符串的函数,该字符串包含要检查的语言代码和要检查的字符串。它会检查每个语言代码是否在字符串中,一旦找不到所需的语言之一,它就会检查 returns false。如果找到所有内容,则 returns 为真。
你的sql看起来像
select *
from mytable
where CheckHasAllLanguages(language, @languagesToCheck) = 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
我会让你的参数成为一个多 select 并且让每个单独的语言成为一个 selection。您甚至可以为参数提供数据库中的值,以便在出现新语言时自动更新。我将调用此参数 @LangMultiSelect
由于您只需要与所有 select 离子匹配的项目,因此您需要传入第二个参数,其中包含已 selected 的项目数。在数据集的属性中,您可以添加另一个由表达式设置的参数。将其命名为 @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 来确定项目具有的匹配数,然后只有 returns 个匹配所有 select 的结果multi-select参数中的离子。
之所以有效,是因为我将计数拆分为一个字段,该字段对于所有相同项目但使用不同语言的项目名称都是相同的。如果您没有这样的字段,这将不起作用。