在SQL

时间:2016-06-09 21:34:19

标签: sql sql-server tsql

我在表中有两组列:

  • 提供商语言:Column1 - Column4
  • Office语言:Column5 - Column8

我的任务是,如果提供商语言少于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个字符串:

  1. 英语,泰米尔语,瑞典语
  2. 英语,德语
  3. 我需要生成一个包含英语,泰米尔语,瑞典语,德语的最终字符串。这是我无法弄清楚的部分。我认为我的方法可能不正确,这就是为什么我想知道某人是否有更好的主意。

    很抱歉,如果有些人觉得我没有提供足够的信息。

2 个答案:

答案 0 :(得分:2)

我会称之为非常棘手。一种方法是取消数据的显示,选择不是NULL的值,枚举它们,然后重新聚合以获得四种语言。

这很麻烦。可以使用joingroup 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