可以返回交叉数据的SQL查询

时间:2010-06-12 18:19:52

标签: sql-server sql-server-2008 sql

我很难找到一个好的问题标题 - 让我告诉你我拥有什么以及期望的结果是什么。我希望这可以在SQL中完成(我有SQL Server 2008)。

1)我有一个名为Contacts的表,在该表中我有这样的字段:

FirstName, LastName, CompanyName

2)一些演示数据:

FirstName LastName CompanyName
John      Smith    Smith Corp
Paul      Wade  
Marc      Andrews  Microsoft
Bill      Gates    Microsoft
Steve     Gibbs    Smith Corp
Diane     Rowe     ABC Inc.

3)我想得到一份人员和公司的交叉清单,但公司只有一次。这看起来像这样:

Name
ABC Inc.
Bill Gates
Diane Rowe
John Smith   
Marc Andrews
Microsoft
Smith Corp
Steve Gibbs
Paul Wade

我可以用SQL做到这一点吗?怎么样?

3 个答案:

答案 0 :(得分:2)

您获取所有人名,然后还添加所有公司

SELECT CONCAT([First Name],' ',[Last Name]) AS Name FROM Contacts
UNION ALL
SELECT DISTINCT CompanyName FROM Contacts
   WHERE CompanyName IS NOT NULL

DISTINCT关键字确保公司只输出一次,并输出WHERE 子句删除没有公司信息的行。

如果某人与公司名称相同,则会输出副本。如果您不想这样做,请将UNION ALL更改为UNION,任何名称只会输出一次。

答案 1 :(得分:1)

我不确定“交叉”是什么意思,但你可以轻松地将你描述的结果作为两个查询对同一个表的联合。

select
    t.firstname + ' ' + t.lastname
from
    mytable t
union
select
    t.company
from
    mytable t

编辑:UNION应默认使每个SELECT不同。

答案 2 :(得分:1)

这可以满足您的需求吗?

SELECT FirstName + ' ' + LastName AS Name
FROM Contacts 
UNION
SELECT CompanyName
FROM Contacts 

UNION而不是UNION ALL将确保顶部和底部两者的清晰度。如果您确实需要重复人名的可能性,mdma的答案将起作用。您可能需要添加{{ 1}}取决于你的需要)