Sql server T-SQL查询一行中可用和选定的组合
我有两张桌子。一个是Sql server T-SQL查询一行中可用和选定的组合,sql-server,Sql Server,我有两张桌子。一个是库表,另一个是关系表(见下文)。表1列出了所有可能的邮件列表(或任何内容),表2表明联系人“John”列在邮件列表1,3,4中。 是否可以编写查询以在一行中获取所有可用邮件列表项和选定项?你能帮忙吗 一行输出: John, A:1, B:0, C:1, D:1, E:0 Mary, A:1, B:0, C:0, D:0, E:1 表1(图书馆表) 表2(关系表) 将表2中的不同触点与表1交叉连接,然后将结果与表2左连接 如果希望邮件列表在单列中用
库
表,另一个是关系表(见下文)。表1
列出了所有可能的邮件列表(或任何内容),表2
表明联系人“John”列在邮件列表1,3,4中。
是否可以编写查询以在一行中获取所有可用邮件列表项和选定项?你能帮忙吗
一行输出:
John, A:1, B:0, C:1, D:1, E:0
Mary, A:1, B:0, C:0, D:0, E:1
表1(图书馆表)
表2(关系表)
将表2中的不同触点与表1交叉连接,然后将结果与表2左连接 如果希望邮件列表在单列中用逗号分隔,请使用
for xml path()
技巧。试试这个
;WITH cte
AS (SELECT b.contact,
a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN ':1' ELSE ':0' END AS aval_mailinglist
FROM tab1e1 a
CROSS JOIN (SELECT DISTINCT contact
FROM table2) b
LEFT JOIN table2 c
ON a.Id = c.[Mail-id]
and b.contact=c.contact)
SELECT contact,
stuff((SELECT ',' + aval_mailinglist
FROM cte b
WHERE a.contact = b.contact
FOR xml path('')),1,1,'') Mailing_list
FROM cte a
group by contact
如果希望结果显示在不同的列中,请使用Pivot
DECLARE @cols VARCHAR(max)='',
@sql NVARCHAR(max)
SELECT @cols += NAME
FROM (SELECT DISTINCT Quotename(Isnull(NAME, '')) + ',' NAME
FROM table1)a
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
PRINT @cols
SET @sql=';WITH cte
AS (SELECT b.contact,
a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN '':1'' ELSE '':0'' END AS aval_mailinglist,
a.name
FROM table1 a
CROSS JOIN (SELECT DISTINCT contact
FROM table2) b
LEFT JOIN table2 c
ON a.Id = c.[Mail-id]
and b.contact=c.contact)
SELECT *
FROM cte a
pivot (max(aval_mailinglist) for name in ('
+ @cols + ') ) piv'
--print @sql
EXEC Sp_executesql @sql
请编辑您的文章并添加所需的输出。请将John与表1交叉连接,然后左连接表2,这样它似乎无法正常工作。如果我在关系表中添加更多联系人。然后查询失败了。例如:如果我添加了。联系邮件id约翰1约翰3约翰4玛丽1玛丽5@GeorgeHuang-需要第一次查询或第二次查询的输出。。约翰,A:1,B:0,C:1,D:1,E:0玛丽,A:1,B:0,C:0,D:0,E:1再次感谢您的帮助、提示或指导。:-)
;WITH cte
AS (SELECT b.contact,
a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN ':1' ELSE ':0' END AS aval_mailinglist
FROM tab1e1 a
CROSS JOIN (SELECT DISTINCT contact
FROM table2) b
LEFT JOIN table2 c
ON a.Id = c.[Mail-id]
and b.contact=c.contact)
SELECT contact,
stuff((SELECT ',' + aval_mailinglist
FROM cte b
WHERE a.contact = b.contact
FOR xml path('')),1,1,'') Mailing_list
FROM cte a
group by contact
DECLARE @cols VARCHAR(max)='',
@sql NVARCHAR(max)
SELECT @cols += NAME
FROM (SELECT DISTINCT Quotename(Isnull(NAME, '')) + ',' NAME
FROM table1)a
SELECT @cols = LEFT(@cols, Len(@cols) - 1)
PRINT @cols
SET @sql=';WITH cte
AS (SELECT b.contact,
a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN '':1'' ELSE '':0'' END AS aval_mailinglist,
a.name
FROM table1 a
CROSS JOIN (SELECT DISTINCT contact
FROM table2) b
LEFT JOIN table2 c
ON a.Id = c.[Mail-id]
and b.contact=c.contact)
SELECT *
FROM cte a
pivot (max(aval_mailinglist) for name in ('
+ @cols + ') ) piv'
--print @sql
EXEC Sp_executesql @sql