Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中按两列计数?_Sql_Sql Server - Fatal编程技术网

在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
你太近了

两件事:

  • 使用子查询/派生表仅选择数据透视所需的列
  • 别把墨菲拼错了
  • rextester演示:

    返回:

    +----------+--------+---------+----------+
    | 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] 然后它将以内联方式显示图像,而不是以链接的形式。因此,如果您上传的图像看起来像链接,而不是缩略图,请输入一个
    。我花了很长时间才弄清楚这一点