使用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进行复杂查询编写的不同方法。我不是在寻找一个确切的答案,但是任何有助于我指向正确方向的帮助都会很棒。我全都是为了学习和扩展我的知识,而不是给予我的东西。
答案 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;
答案 1 :(得分:0)
如果您不需要将它们全部放在一行中,那么您可以这样做:
SELECT [Date],
[Name],
COUNT(*)
FROM [MyDatabase].[dbo].[LogInData]
WHERE [Date] >= '2013-07-01'
GROUP BY [Date],[Name]