你如何证明未知数?

时间:2013-07-25 17:29:39

标签: sql sql-server database tsql pivot

使用CASE语句选择计数到多个列时遇到了问题。 CASE语句如何为我工作就像是C / C ++中的IF语句。如果该值等于X,则执行Y ELSE do 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进行复杂查询编写的不同方法。我不是在寻找一个确切的答案,但是任何有助于我指向正确方向的帮助都会很棒。我全都是为了学习和扩展我的知识,而不是给予我的东西。

2 个答案:

答案 0 :(得分:9)

你会这样做:

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

然后也许你可以转动,但你不一定要在查询中这样做。在不知道您拥有的名称(以及列数)时这样做将需要动态SQL来构建正确的数据透视 - 但同样,您可以在表示层转置此信息,并让SQL Server以优化的方式返回此数据要做。

那就是说,我相信bluefeet很快就会举一个例子。

实际上,bluefeet不在了,所以我会填写:

DECLARE @date DATE = '2013-07-01';

DECLARE @sql NVARCHAR(MAX) = N'', @cols NVARCHAR(MAX) = N'';

SELECT @cols += STUFF((SELECT ',' + QUOTENAME(Name)
                       FROM dbo.LoginData
                       WHERE [Date] >= @date
                       GROUP BY Name
                       FOR XML PATH('')), 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 sp_executesql @sql, N'@date DATE', @date;

SQLfiddle demo

答案 1 :(得分:0)

如果您不需要将它们全部放在一行中,那么您可以这样做:

SELECT [Date],
       [Name],
       COUNT(*)
FROM [MyDatabase].[dbo].[LogInData]
WHERE [Date] >= '2013-07-01'
GROUP BY [Date],[Name]
相关问题