Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联接三个表并将最后一个表行显示为列_Sql_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

Sql 联接三个表并将最后一个表行显示为列

Sql 联接三个表并将最后一个表行显示为列,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有以下表格: tblData: ID Name Email -------------------------------------- 1 TestName1 test@email.com 2 TestName2 test2@email.com 3 TestName3 test3@email.com TBL邮件: ID Name Content ------

我有以下表格:

tblData:

ID       Name         Email   
--------------------------------------   
1        TestName1    test@email.com
2        TestName2    test2@email.com
3        TestName3    test3@email.com
TBL邮件:

ID      Name             Content
------------------------------------------------
1       MailName1        Mail1 contents goes here
2       MailName2        Mail2 contents goes here
3       MailName3        Mail3 contents goes here
TBL合同:

ID      DataId      MailId
-------------------------------
1       1           1
2       1           2
3       3           1
4       3           3
现在,我想编写一个返回以下结果的查询:

ID      Name        Email             MailName1        MailName2        MailName3
----------------------------------------------------------------------------------
1       TestName1   test@email.com    True             True             False
2       TestName2   test2@email.com   False            False            False
3       TestName3   test3@email.com   True             False            True
此外,
tblMail
是动态的。。它可以有更多行。因此,如果将来我添加新行,该列将显示在结果中


任何帮助都将不胜感激。谢谢

您可以像这样动态构建sql:

declare @mailfields nvarchar(max) = N'',
        @mailfieldselect nvarchar(max) = N'',
        @sql nvarchar(max) = N'',
        @dlm nchar(1)= ''

select @mailfields=@mailfields + @dlm + N'[' + Name + N']', 
  @mailfieldselect = @mailfieldselect + @dlm + N'case when [' + Name + N'] = 0 then ''False'' else ''True'' end as ' + Name, 
  @dlm=',' 
from tblMail

select @sql ='select ID, Name, ' + @mailfieldselect + ' 
from (
  select d.ID, d.Name, m.Name as MailName 
  from tblData d 
  left join tblContacts c on d.Id=c.DataId 
  left join tblMail m on c.MailId=m.Id) f
pivot (count(MailName)
       for MailName in (' + @mailfields + ')) p'

exec (@sql)

我甚至在这里添加了一个SQL Fiddle示例:

您需要PIVOT函数来实现您的目标。但是,由于
tblMail
是动态的,并且需要不同数量的
MailNameX
列,因此必须使用动态sql。不好玩,但可行。是的,我用pivot尝试了一些事情,但没有得到完全正确的结果。@DMasonAre你确定要这样显示结果吗?这意味着你会收到一百封邮件,一百栏,这不是很可读。事实上,你得到的是一个矩阵NxM,其中n是数据的数量,M是邮件的数量,我不会将你显示的结果限制在一系列数据或电子邮件中?我同意上述评论。我看不出这样扩展列有什么好处。在这种格式的UI中,数据也将不可用。如果您确实想在UI中进行操作,那么最好的办法是将数据带回来,然后进行显示。