2017-08-07 107 views
1

下面是一個例子表:如何結合EXEC語句結果?

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 
+1

這就是所謂的聯接。 –

+1

@TabAlleman實際上你不能加入EXEC的結果,他使用動態SQL,所以不能轉換爲標準查詢......你需要一個Temp表(或表變量),並將兩個結果都插入到那個 – Milney

+0

我想他可以在他的動態sql中加入JOIN。 –

回答

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; 
+0

謝謝! ...... – lukehawk

+0

非常歡迎。 – Eli

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