连接多行和多列的不同值

时间:2018-03-21 16:38:51

标签: sql sql-server-2008 tsql

我有这张桌子:

VAT | Emails
000 |  a@a.it, b@b.it, c@c.it, d@d.it

我想要这个结果:

<Application.Resources>
    <Style TargetType="{x:Type ToolTip}">
        <Setter Property="Template" Value="{x:Null}" />
    </Style>
</Application.Resources>

如何在SQL中执行此操作?

请注意,我希望同时连接多个列的值。

2 个答案:

答案 0 :(得分:2)

嗯,这不是与question Lad2025相关联的完全重复, 但该问题的答案确实显示了如何将不同行的值转换为逗号分隔的字符串 您还要做的一件事是从两列中获取每个增值税的明确电子邮件列表。 这是一种方法:

首先,创建并填充样本表(在将来的问题中保存此步骤):

DECLARE @T AS TABLE
(
    VAT char(3),
    Email1 char(6),
    Email2 char(6)
)

INSERT INTO @T(VAT,Email1, Email2) VALUES
('000', 'a@a.it', 'b@b.it'),
('000', 'a@a.it', NULL),
('000', 'a@a.it', 'c@c.it'),
('000', NULL, 'd@d.it')

然后,使用公用表表达式使用email1组合email2union的值。
请注意,union会删除重复的值,因此您将获得每个增值税值的不同电子邮件列表:

;WITH CTE AS
(
    SELECT VAT, Email1 As Email
    FROM @T
    UNION
    SELECT VAT, Email2
    FROM @T
)

然后使用for xml path从cte的电子邮件列中获取以逗号分隔的列表(将忽略null值),并使用stuff删除第一个逗号:

SELECT DISTINCT VAT, 
                (
                    SELECT STUFF(
                        (SELECT ',' + Email
                        FROM CTE t1
                        WHERE t0.VAT = t1.VAT
                        FOR XML PATH(''))
                        , 1, 1, '')
                ) As Emails
FROM CTE t0

结果:

VAT     Emails
000     a@a.it,b@b.it,c@c.it,d@d.it

答案 1 :(得分:0)

这是另一种选择,但上述情况可能会更快。

cljs.user=> (def ids [{:x 1 :y 2} {:x 3 :y 4}])
#'cljs.user/ids
cljs.user=> (let [tr [:tr 
       #_=>           [:td "first col"]
       #_=>           [:td "second col"]]]
       #_=>   (reduce (fn [acc id]
       #_=>             (into acc
       #_=>                   [[:td [:span (:x id)]]
       #_=>                    [:td [:span (:y id)]]]))
       #_=>           tr
       #_=>           ids))
[:tr [:td "first col"] [:td "second col"] [:td [:span 1]] [:td [:span 2]] [:td [:span 3]] [:td [:span 4]]]
cljs.user=> 

结果:

DECLARE @TBL TABLE(VAT varchar(10), Email1 varchar(50), Email2 varchar(50))
INSERT INTO @TBL select '000','a@a.it','b@b.it'
INSERT INTO @TBL  select '000','a@a.it',''
INSERT INTO @TBL  select '000','a@a.it','c@c.it'
INSERT INTO @TBL select '000','pizz@pizza.com','d@d.it'
INSERT INTO @TBL select '001','slice@pizza.com','d@d.it'
INSERT INTO @TBL select '001','pizz@pizza.com','q@q.it'
INSERT INTO @TBL select '001','cheese@pizza.com','s@s.it'
INSERT INTO @TBL select '001','slice@pizza.com','s@s.it'
INSERT INTO @TBL select '001',NULL,'s@s.it'

SELECT VAT, '' + REVERSE(STUFF(REVERSE(( select x.Email + ','
FROM (
    select VAT, Email1 as Email 
    from @TBL T2 
    WHERE T2.VAT = T1.VAT
        AND ISNULL(Email1,'') > ''
    GROUP BY VAT, EMAIL1
    union 
    select VAT, Email2 as Email 
    from @TBL T3 
    WHERE T3.VAT = T1.VAT
        AND ISNULL(Email2,'') > ''
    GROUP BY VAT, EMAIL2
) x
FOR XML PATH('')
)), 1, 1, '' ) ) + '' as Email
from @TBL T1
GROUP by T1.VAT
相关问题