1

我有一个复杂的问题需要用 SQL 查询来解决。我需要生成一个报告,该报告给出一个数值,该数值代表用户在一年中每个月执行的一些操作。例如,如果 User1 在 1 月和 7 月执行了指定的操作,则查询需要在名为“一月”和“七月”的列中返回数字 1,在表示其他月份的列中返回 0。我从中提取数据的表只有一列,其中包含执行特定操作的日期和时间(这是与此特定问题相关的唯一列)。我需要进行一个 SQL 查询,该查询将在特定时间段内为每个用户返回此信息。请帮忙,如果您需要更多信息,请告诉我,我会提供。谢谢

结果的结构应该是这样的: User Jan Feb ..... Dec UID 1 0 1

对于所选期间出现的每个用户,我都需要这个。我的应用程序使用的是 SQL Server 2005。

4

3 回答 3

2
select  datepart(month, dateColumn) as Month
,       count(*) as NumberOfActions
from    Actions
group by
        datepart(month, dateColumn)
于 2012-12-13T10:30:59.393 回答
0

上面的查询是正确的,虽然这只会返回一个月份的数字。

我会做以下事情。

SELECT  dateparth(month, dateColumn) as Month, count(*) as NumberOfActions
FROM Actions
GROUP BY Month

然后(如果使用 php)考虑 mktime() 和 date() 函数。像这样:

/* The year doesn't matter. we are just trying to format this in to a date */
    $date = mktime(0, 0, 0, $row->Month, 1, 2012); 

/* This will display 'Jan, Feb, Mar ...' respectively */
    $dateText = date('M', $date); 

如果使用另一种语言,那么只需谷歌替代。这将是相同的原理..只是语法不同。

希望这可以帮助。

于 2012-12-13T10:46:50.000 回答
0

这将按行返回数据,但我认为 OP 实际上是在列中要求它。你需要一个PIVOT声明,像这样的......

假设...

Create Table TestPivot (UserName Varchar(10), DateColumn DateTime);

然后...

Select *
  From (Select UserName, DateName(Month, DateColumn) As Month_Name, Count(*) As Month_Count
          From TestPivot
         Group By UserName, DateName(Month, DateColumn)) As SourcePart
  Pivot (Sum(Month_Count)
         For Month_Name In (January, February, March, April, May, June, 
                            July, August, September, October, November, December)) As PivotPart
于 2012-12-13T10:56:32.480 回答