2012-05-09 93 views
0

我需要用数据填充条形图。我拥有一切。我有用于收集数据的sql查询。循环12个月

我在寻找的是提供当前月份和过去11个月(总共12个月)数据的最佳方式。

此代码将为我提供当前月份的信息,直到今天。我怎样才能修改这个,这样它也会给我前11个月的信息?

将对该查询进行此修改还是将我们循环查询12次?

protected void FillChart() 
{ 
    DateTime now = DateTime.Now; 
    DateTime startDate = now.AddDays(1 - now.Day); 
    DateTime endDate = now; 
    string query; 

    query = "SELECT SUM(case when r.Type in ('Programming-Billable', 'Consulting-Billable') then r.Minutes_Spent"; 
    query += " end) AS 'Custom Programming and Consulting',"; 
    query += " SUM(case when r.Type in ('Data Maintenance', 'Tech Support-Billable', 'Training') then r.Minutes_Spent"; 
    query += " end) AS 'Tech. Support/Data Maint./Training'"; 
    query += " FROM TK_Project p "; 
    query += " INNER JOIN TK_Task t"; 
    query += " ON p.Project_ID = t.Project_ID "; 
    query += " JOIN TK_Time_Record r"; 
    query += " ON t.ID = r.Task_ID"; 
    query += " WHERE p.Company = " + Session[ "Distid" ]; 
    query += " AND p.Name ='Technical Support' "; 
    query += " AND r.Work_Date BETWEEN '" + startDate + "' AND '" + endDate + "' "; 
    query += " AND r.Type NOT LIKE '%non%'"; 


    DataTable data = GeneralFunctions.GetData(query); 
} 

查询目前返回以下结果:

Custom Programming and Consulting Tech. Support/Data Maint./Training 
      90           105 

编辑:

SELECT SUM(case when r.Type in ('Programming-Billable', 'Consulting-Billable') then r.Minutes_Spent 
      end) AS 'Custom Programming and Consulting', 
     SUM(case when r.Type in ('Data Maintenance', 'Tech Support-Billable', 'Training') then r.Minutes_Spent 
      end) AS 'Tech. Support/Data Maint./Training' 
FROM TK_Project p 
INNER JOIN TK_Task t 
    ON p.Project_ID = t.Project_ID 
JOIN TK_Time_Record r 
    ON t.ID = r.Task_ID 
WHERE p.Company = 162 AND p.Name ='Technical Support' 
AND r.Work_Date BETWEEN '04/01/2001' AND '04/30/2012' 
AND r.Type NOT LIKE '%non%' 
+0

变化的startDate的一个月now.AddYears(-1),然后添加GROUP BY MONTH(r.Work_Date) – Kevin

+0

@Kevin得到多少接近。是否可以在查询中显示当前月份?那么4月= 4,1月= 1,3月= 3? –

回答

1

你只需要改变的开始和结束日期:

DateTime startDate = now.AddYears(-1); 
DateTime endDate = now; 

顺便说一句,它可能会更好地使用两个日期时间参数。所以你应该将它们传递给GetData方法并从中创建SqlParameters。

编辑:如果你想有每月的总和,你需要按月分组。

GROUP BY DATEADD(month, DATEDIFF(month, 0, Work_Date),0) 

可以省略结束日期,如果你想获得的所有记录,直至现在反正:

SELECT SUM(case when r.Type in ('Programming-Billable', 'Consulting-Billable') then r.Minutes_Spent 
      end) AS 'Custom Programming and Consulting' 
    , SUM(case when r.Type in ('Data Maintenance', 'Tech Support-Billable', 'Training') then r.Minutes_Spent 
      end) AS 'Tech. Support/Data Maint./Training' 
    , DATEADD(month, DATEDIFF(month, 0, Work_Date),0) AS Month 
FROM TK_Project p 
INNER JOIN TK_Task t 
    ON p.Project_ID = t.Project_ID 
JOIN TK_Time_Record r 
    ON t.ID = r.Task_ID 
WHERE p.Company = 162 AND p.Name ='Technical Support' 
AND r.Work_Date BETWEEN @startDate AND GetDate() 
AND r.Type NOT LIKE '%non%' 
GROUP BY DATEADD(month, DATEDIFF(month, 0, Work_Date),0) 
Order By Month 

请注意,我已经添加了@startDate作为参数。

+0

这不会将查询分解成月份。该查询将返回所有12个月的总和结果,而不是12个不同的结果/行/列。我不确定要达到这个目标的最佳甚至是简单的方法。我需要填写表格,其中包含每个月每个类别的总分钟数的信息。然后jquery接管并将该信息放入画布条形图。 –

+0

你将需要一个group-by,在每个月使用datepart(),我认为 –

+0

@JamesWilson:你可以向我们展示没有查询+ =“'s的查询吗?那么它会容易得多改进sql查询 –

0

也许我不理解的问题,但它听起来像是你需要开始结束日期作为参数FillChart()

+0

因此,我正在构建一个图表,显示过去12个月的数据。它会一直显示当前月份和当前月份之前的11个月(当前月份=今天的月份)。因为我迫使他们显示今天和11个月前我不认为日期需要参数。 –

+0

所以,你想要一个单一的方法,返回12组数据,一个为本月和11为每个前一个月?我期待着您会调用参数化的FillChart()方法来获取每个数据集并将它们合并到别处。 – neontapir

+0

是的我只是不确定这是最好的方法来处理,或者如果sql查询应该被修改来做到这一点。无论哪种情况,我都不知道该怎么做。 –

1

如果我理解正确的要求,你会集团通过Work_Date

Group by datepart(month, r.Work_Date) 
+0

这使我更接近期望的结果。是否有可能在查询中返回该月份?因此,4月将返回给我'月 - > 4自定义编程和咨询 - > 90技术支持/数据维护/培训 - > 105' –

+0

没想到我已经想通了,刚刚在选择列表中添加了“MONTH(r.Work_Date)AS Month”。 –

+0

@詹姆斯....太棒了! – MikeTWebb