以下是一个示例表:
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
答案 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