我在表中有两组列:
我的任务是,如果提供商语言少于4,则从“提供商语言”中不存在的Office语言列集中选择语言。
示例:
Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8
English Tamil Swedish English German
在上面的例子中,结果应该是英语,泰米尔语,瑞典语,德语
我需要在SQL中完成所有这些操作,而我不知道如何使用SQL来解决这个问题。任何关于此的帮助/想法都将受到赞赏。
我的方法是以CSV格式连接所有提供者语言:
English, Tamil, Swedish (Done this)
接下来,我检查一下语言的数量。这里的示例是3(完成此操作)。
现在我需要为员工语言执行类似的任务:英语,德语(完成此操作)
但现在出现了问题:
我有2个字符串:
我需要生成一个包含英语,泰米尔语,瑞典语,德语的最终字符串。这是我无法弄清楚的部分。我认为我的方法可能不正确,这就是为什么我想知道某人是否有更好的主意。
很抱歉,如果有些人觉得我没有提供足够的信息。
答案 0 :(得分:2)
我会称之为非常棘手。一种方法是取消数据的显示,选择不是NULL
的值,枚举它们,然后重新聚合以获得四种语言。
这很麻烦。可以使用join
和group by
以及其他一些逻辑。另一种方法是使用outer apply
:
select t.*, x.*
from t outer apply
(select max(case when seqnum = 1 then val end) as value1,
max(case when seqnum = 2 then val end) as value2,
max(case when seqnum = 3 then val end) as value3,
max(case when seqnum = 4 then val end) as value4
from (select val, row_number() over (order by min(pos)) as seqnum
from (values(1, value1), (2, value2), (3, value3) . . .) v(pos, val)
where val is not null
group by val
) x
) x;
删除重复项由最里面的查询中的group by
处理。每个值仅在查询结果中出现一次 - 即使存在于多列中。
答案 1 :(得分:0)
请使用以下代码。它在SQL Server 2012中运行良好。
DECLARE @Table TABLE (ID int, Languages Varchar (8000))
DECLARE @temp TABLE (Languages Varchar (8000))
INSERT @Table
(ID,Languages)
VALUES
(1,'English, Tamil, Swedish'),
(2,'English, German')
-- Execution Part
INSERT INTO @temp
(Languages)
(
SELECT DISTINCT Split.a.value('.', 'VARCHAR(100)') AS Languages FROM
(SELECT ID,CAST ('<M>' + REPLACE(Languages, ',', '</M><M>') + '</M>' AS XML) AS Languages FROM @Table A) AS A
CROSS APPLY Languages.nodes ('/M') AS Split(a)
)
SELECT DISTINCT Languages =
STUFF((SELECT ', ' + Languages
FROM @temp b
FOR XML PATH('')), 1, 1, '')
FROM @temp a