在SQL Server中按两列计数?
下面是一个示例表:在SQL Server中按两列计数?,sql,sql-server,Sql,Sql Server,下面是一个示例表: CREATE TABLE Example ( LastName varchar(255), FirstName varchar(255), HomeAddress varchar(255), City varchar(255) ); INSERT INTO Example VALUES ('Murphy', 'James','123 Easy St', 'New York'); INSERT INTO Example VALUES ('B
CREATE TABLE Example
(
LastName varchar(255),
FirstName varchar(255),
HomeAddress varchar(255),
City varchar(255)
);
INSERT INTO Example VALUES ('Murphy', 'James','123 Easy St', 'New York');
INSERT INTO Example VALUES ('Black', 'John','123 Easy St', 'Boston');
INSERT INTO Example VALUES ('Black', 'Amy','123 Easy St', 'Chicago');
INSERT INTO Example VALUES ('Simpson', 'Bill','123 Easy St', 'New York');
INSERT INTO Example VALUES ('Jones', 'James','123 Easy St', 'Chicago');
INSERT INTO Example VALUES ('Black', 'John','123 Easy St', 'Boston');
INSERT INTO Example VALUES ('Murhpy', 'James','123 Easy St', 'New York');
我希望能够通过两列来计数,“LastName”和“City”。那就是——我想要这个:
Name New York Boston Chicago
-------------------------------------
Jones 0 0 1
Black 0 2 1
Simpson 1 0 0
Murphy 2 0 0
我的问题类似于。我创建了以下内容,结果非常接近:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames = ISNULL(@PivotColumnNames + ',','') + QUOTENAME(City)
FROM (SELECT DISTINCT City FROM Example) AS cat
--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames
= ISNULL(@PivotSelectColumnNames + ',','')
+ 'ISNULL(' + QUOTENAME(City) + ', 0) AS '
+ QUOTENAME(City)
FROM (SELECT DISTINCT City FROM Example) AS cat
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT LastName, ' + @PivotSelectColumnNames + '
FROM Example
pivot(count(City) for City in (' + @PivotColumnNames + ')) as pvt';
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'Select LastName, ' + @PivotSelectColumnNames + ' from ( SELECT LastName, City
FROM Example ) a
pivot(count(City) for City in (' + @PivotColumnNames + ')) as pvt';
但是,这并不是我想要的。它产生了以下结果:
我试图将“groupbylastname”添加到查询的末尾,但不起作用。我得到一个错误:
Column 'pvt.Boston' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
我认为simple pivot会给出您的查询结果
Select * from (
Select LastName, City from Example ) a
pivot (count(city) for city in ([New York],[Boston],[Chicago])) p
如果您按以下方式更改查询,您将得到适当的结果:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames = ISNULL(@PivotColumnNames + ',','') + QUOTENAME(City)
FROM (SELECT DISTINCT City FROM Example) AS cat
--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames
= ISNULL(@PivotSelectColumnNames + ',','')
+ 'ISNULL(' + QUOTENAME(City) + ', 0) AS '
+ QUOTENAME(City)
FROM (SELECT DISTINCT City FROM Example) AS cat
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT LastName, ' + @PivotSelectColumnNames + '
FROM Example
pivot(count(City) for City in (' + @PivotColumnNames + ')) as pvt';
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'Select LastName, ' + @PivotSelectColumnNames + ' from ( SELECT LastName, City
FROM Example ) a
pivot(count(City) for City in (' + @PivotColumnNames + ')) as pvt';
输出如下:
+----------+----------+--------+---------+
| LastName | New York | Boston | Chicago |
+----------+----------+--------+---------+
| Black | 0 | 2 | 1 |
| Jones | 0 | 0 | 1 |
| Murhpy | 1 | 0 | 0 |
| Murphy | 1 | 0 | 0 |
| Simpson | 1 | 0 | 0 |
+----------+----------+--------+---------+
不使用PIVOT的替代方法:
DECLARE @sql NVARCHAR(max);
SET @sql = ''; -- not necessary for CONCAT, but necessary if converting this answer to + style string concatenation
SELECT
@sql = CONCAT(@sql, ', COUNT(CASE WHEN city = ''', City, ''' THEN 1 END) as ', QUOTENAME(City))
FROM
Example
GROUP BY City
SET @sql = CONCAT('SELECT Name', @sql, ' FROM example GROUP BY name')
EXEC sp_executesql @sql
你太近了
两件事:
+----------+--------+---------+----------+
| LastName | Boston | Chicago | New York |
+----------+--------+---------+----------+
| Black | 2 | 1 | 0 |
| Jones | 0 | 1 | 0 |
| Murphy | 0 | 0 | 2 |
| Simpson | 0 | 0 | 1 |
+----------+--------+---------+----------+
试试这个-
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @PivotColumnNames = ISNULL(@PivotColumnNames + ',','') + QUOTENAME(City)
FROM (SELECT DISTINCT City FROM #example) AS cat
--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames
= ISNULL(@PivotSelectColumnNames + ',','')
+ 'ISNULL(' + QUOTENAME(City) + ', 0) AS '
+ QUOTENAME(City)
FROM (SELECT DISTINCT City FROM #example) AS cat
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT LastName, ' + @PivotSelectColumnNames + '
FROM #example
pivot(count(City) for City in (' + @PivotColumnNames + ')) as pvt group by LastName, ' + @PivotColumnNames;
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
这不是动态的。我提供的示例是我真正想要的东西的一个简单版本,它需要动态查询一组非常大的可能的“City”和“LastName”值。你知道如何编辑我发布的查询并使其产生正确的结果吗?在你的例子中,你有Murphy和Murphy,因此它会得到两个不同的记录,并据此更新哈-对不起。抢手货不过,琼斯仍然有问题。这不是动态的。我发布的示例是一个很小的简化版本。我使用上述方法来避免列出数百行
计数(Case…
修改,抱歉!谢谢!!我比PIVOT版本更喜欢这个版本,但我现在使用的是Server 2008。我认为CONCAT是在2012年引入的,我无法让这段代码正常工作。你知道如何让它像2008年一样工作吗?这在2012年起作用,但当我尝试从使用CONCAT()改为使用“+”(以使它在2008年正常工作),查询似乎有效,但没有显示任何内容。我只是看到命令成功完成。
当一个变量为null时会发生这种情况。CONCAT的妙处在于您可以CONCAT('john',null,'smith'))
并获取“johnsmith”。如果您尝试使用+,任何+a null都是null。我将编辑sql以防止出现这种情况,感谢您让我知道…(编辑:added set@sql='')不要拼写错误Murphy…哈哈!编辑它,选择所有文本并按下编辑区域上方的{}按钮谢谢Caius。我今天在这个论坛上学到了一些新东西:-)另一个技巧,然后..这真的很模糊。如果你上传一个图像,使用SO的图像上传,它会上传到imgur,并在编辑框的末尾放置一个类似于维基百科参考的[1]链接,然后将[输入图像描述符][1]
放在你的帖子中。如果你像!
那样添加一个前导的!
,[image of excel grid][1] 然后它将以内联方式显示图像,而不是以链接的形式。因此,如果您上传的图像看起来像链接,而不是缩略图,请输入一个!
。我花了很长时间才弄清楚这一点