【问题标题】:Create report in Monthly calendar format to display data in each column of date以月历格式创建报告以在日期的每一列中显示数据
【发布时间】:2017-01-17 04:43:24
【问题描述】:

我想创建一个报告,我将在其中显示每个月每天在我的网站上注册用户的数量。

我正在使用 ASP.NET 4.5 和 C# 进行后端编码。我正在从数据库中获取数据以计算使用 SQL Server 2008 的每日注册用户数。

这是我的存储过程,我从表中检索每日注册用户的数据。

select  tb.Month, 
        tb.day, 
        COUNT(tb.Month) as Total 
from (
    select  intId, 
            MONTH(dtRegDate) as Months, 
            datename(month, dtRegDate) as Month, 
            DATENAME(DAY, dtRegDate) as day
    from tblUserDetails
    ) tb
group by tb.Month, tb.day, Months
order by tb.Months

现在我想以表格格式显示此结果数据,如下图所示。

请帮助我。提前致谢。

【问题讨论】:

    标签: c# asp.net sql-server tsql


    【解决方案1】:

    我猜你想数intID 而不是Month。您可以使用旋转:

    ;WITH cte AS (
    select  tb.[Months],
            tb.[Month], 
            tb.[Day], 
            COUNT(tb.intId) as [Total]
    from (
            select  intId, 
                    MONTH(dtRegDate) as [Months],
                    datename(month, dtRegDate) as [Month], 
                    DATENAME(DAY, dtRegDate) as [Day]
            from tblUserDetails
        ) tb
    group by tb.Month, tb.day, Months
    )
    
    SELECT *
    FROM cte
    PIVOT (
        SUM([Total]) FOR [Day] IN ([1],[2],[3]...)
    ) pvt
    order by [Months]
    

    【讨论】:

    • OMG :D @gofr1 ,我什至无法在这个级别上思考。这个答案简直太神奇了。非常感谢,您为我节省了很多时间 :)
    • 你能解释(教)我,这个 PIVOTING 是如何工作的吗?我昨天试图理解,但我无法理解。再次感谢。
    • 我想在上面的查询中显示0而不是NULL,你能告诉我在哪里应用ISNULL函数吗?
    • 首先,我们得到一个类似于您屏幕截图的表格,而不是我们使用任何聚合函数(max、min、sum、avg)并将其应用于我们想要计算的列(Total)和比我们确定列,行值将显示为列(Days)。更多信息herehere
    • 您收到NULLs 是因为您在某些月份/几天内没有数据(例如您的屏幕截图中的 8 月 7、15、21 日)。有两种方法可以消除空值:首先是在 CTE 的最后一次选择中使用 [Month],ISNULL([1],0) as [1],...,ISNULL([n],0) as [n] 而不是 *,其次是使用一些日历表 UNION 它与您的表将填补空白。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多