如何结合EXEC语句结果?

时间:2017-08-07 14:29:09

标签: sql sql-server

以下是一个示例表:

CREATE TABLE Example 
(
    LastName varchar(255),
    FirstName varchar(255),
    HomeAddress varchar(255),
    City varchar(255), 
    Gender varchar(255),
    Role_Type varchar(255),
);

INSERT INTO Example 
VALUES ('Murphy', 'James','123 Easy St', 'New York','Male', 'Manager'),
       ('Black', 'John','345 Youfarted St', 'Boston','Male', 'Employee'),
       ('Black', 'Amy','123 Simple St', 'Chicago','Female', 'Manager'),
       ('Simpson', 'Bill','123 Whofarted St', 'New York','Male', 'Employee'),
       ('Jones', 'Cindy','321 Foo St', 'Chicago','Female', 'Employee'),
       ('Black', 'John','275 Ipsum St', 'Boston','Male', 'Employee'),
       ('Murphy', 'Stephanie','983 Ifarted St', 'New York','Female', 'Employee');

这两个exec语句是动态的,不使用我喜欢的PIVOT。我想保持它们相同(在功能上最小,但实际上更好)。

DECLARE @sql1 NVARCHAR(max) = '', @sql2 NVARCHAR(max) = ''

SELECT 
    @sql1 = @sql1 + ', COUNT(CASE WHEN city = ''' + City + ''' THEN 1 END) as ' + QUOTENAME(City) 
FROM
    Example
WHERE 
    City IS NOT NULL
GROUP BY 
    City

SET @sql1 = 'SELECT LastName' + @sql1 + ' FROM example GROUP BY LastName'

EXEC sp_executesql @sql1

SELECT 
    @sql2 = @sql2 + ', COUNT(CASE WHEN Role_Type = ''' + Role_Type + ''' THEN 1 END) AS ' + QUOTENAME(Role_Type) 
FROM
    Example
WHERE 
    Role_Type IS NOT NULL
GROUP BY 
    Role_Type

SET @sql2 = 'SELECT LastName' + @sql2 + ' FROM example GROUP BY LastName'

EXEC sp_executesql @sql2

这些查询产生了这两个表:

LastName    Boston  Chicago New York
-------------------------------------
Black            2        1        0
Jones            0        1        0
Murphy           0        0        2
Simpson          0        0        1

LastName    Employee    Manager
--------------------------------
Black              2          1
Jones              1          0
Murphy             1          1
Simpson            1          0

如何组合这两个查询?生成一个结果表?类似于下面的内容:

LastName    Boston  Chicago New York Employee Manager
------------------------------------------------------
Black            2        1        0        2       1
Jones            0        1        0        1       0
Murphy           0        0        2        1       1
Simpson          0        0        1        1       0

2 个答案:

答案 0 :(得分:1)

某些连接可以在这里工作 - 我使用您的样本数据对此进行了测试并得到了正确的结果:

DECLARE @sql1 NVARCHAR(max) = '', @sql2 NVARCHAR(max) = '', @sql3 NVARCHAR(MAX) ='';

SELECT 
  @sql1 = @sql1 + ', COUNT(CASE WHEN city = ''' + City + ''' THEN 1 END) as ' + QUOTENAME(City) 
FROM
  Example
WHERE 
    City is not NULL
GROUP BY City;


SELECT 
  @sql2 = @sql2 + ', COUNT(CASE WHEN Role_Type = ''' + Role_Type + ''' THEN 1 END) as ' + QUOTENAME(Role_Type) 
FROM
  Example
WHERE 
    Role_Type is not NULL
GROUP BY Role_Type;


SET @sql3 =  'SELECT LastName' + @sql1 + @sql2 + ' FROM example GROUP BY LastName'

EXEC sp_executesql  @Sql3;

答案 1 :(得分:0)

我认为您需要使用FULL outer join。这应该有效:

Declare @sql3 nvarchar(2000)

 set @sql3 = 'select * from (' + @sql1 + ') A FULL outer join  (' + @sql2 + ') b on a.LastName = b.LastName'
 exec sp_executesql @sql3

示例:https://www.w3schools.com/sql/sql_join_full.asp