sql - 你如何排除未知数?

标签 sql sql-server database tsql pivot

我在使用 CASE 语句将计数选择到多个列时遇到了问题。 CASE 语句对我来说就像 C/C++ 中的 IF 语句一样。如果值等于 X,则执行 Y,否则执行 Z。

为了帮助解释这个问题,让我提供一个查询,该查询计算名为“姓名”的列中的姓名,并按“日期”列对他们进行分组。

SELECT [Date]
       COUNT( CASE WHEN [Name] = 'John' THEN 1 ELSE NULL END) AS 'John',
       COUNT( CASE WHEN [Name] = 'Joe' THEN 1 ELSE NULL END) AS 'Joe',
       COUNT( CASE WHEN [Name] = 'Moe' THEN 1 ELSE NULL END) AS 'Moe',
       COUNT( CASE WHEN [Name] = 'Nick' THEN 1 ELSE NULL END) AS 'Nick',
       COUNT( CASE WHEN [Name] = 'Zack' THEN 1 ELSE NULL END) AS 'Zack'
FROM [MyDatabase].[dbo].[LogInData]
WHERE [Date] >= '2013-07-01'
GROUP BY [Date]

这假设我知道我想要计算的名字。如果我想在单行中计算查询中未定义的新名称怎么办?我怎样才能动态搜索表中的所有 DISTINCT 名称,并像上面那样自动对它们进行单独计数,而无需向代码中添加新名称?

感谢您提供的任何帮助。我仍在尝试学习使用 SQL 编写复杂查询的不同方法。我不是在寻找确切的答案,但任何帮助我指出正确方向的帮助都会很棒。我完全是为了学习和扩展我的知识,而不是给我的东西。

最佳答案

你会用另一种方式来做:

SELECT [Date], [Name], COUNT(*)
  FROM ...
  GROUP BY [Date], [Name];

那么也许您可以进行数据透视,但您不一定必须在查询中这样做。在不知道您拥有的名称(以及列数)的情况下这样做将需要动态 SQL 来构造一个适当的数据透视表 - 但是同样,您可以在表示层转置此信息并让 SQL Server 以优化的方式返回此数据做。

DECLARE @date date = '20130701';

DECLARE @sql  nvarchar(max) = N'', 
        @cols nvarchar(max) = N'';

SELECT @cols = STUFF((SELECT N',' + QUOTENAME(Name)
               FROM dbo.LoginData
               WHERE [Date] >= @date
               GROUP BY Name
               FOR XML PATH(''),
               TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, '');

SET @sql = N'SELECT *
  FROM (SELECT * FROM dbo.LoginData AS d
  WHERE [Date] >= @date
  ) AS d
  PIVOT (COUNT([Name]) FOR [Name] IN (' + @cols + ')) AS p;';

EXEC sys.sp_executesql @sql, N'@date date', @date;

关于sql - 你如何排除未知数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17864846/

相关文章:

sql - 计算最大并发用户 session 数

sql - 转账中带破折号的数字不断减

MySQL 查询从 5 个表中选择连接

ruby-on-rails - Ruby On Rails 迁移

sql - 我可以在 SQL 中的另一个 "With"中做一个内部 "With"吗?

sql - 在 PostgreSQL 中,如何让多个检查约束引用相同的值数组?

sql - sql server中的str_to_date函数?

sql - 用选择概率优化 T-SQL 查询

json - SQL Server 上带有连接查询的 FOR JSON 的平面 JSON 结果

php - 连接不同内容的表