2012-12-07 116 views
0

我有一張門票表。我試圖計算在當年的每個月末,有多少張「開放」的門票。另外,我將它推送到條形圖中,並且我需要通過LINQ將其放入數組中。計算項目,按月循環,每次增加月份通過

我的SQL查詢來獲取我的計算是:

SELECT 
    (SELECT COUNT(*) FROM tblMaintenanceTicket t WHERE (CreateDate < DATEADD(MM, 1, '01/01/2012'))) 
    - 
    (SELECT COUNT(*) FROM tblMaintenanceTicket t WHERE (CloseDate < DATEADD(MM, 1, '01/01/2012'))) AS 'Open @Month End' 

我的邏輯是這樣的:第一計數和月末期間開放所有門票。從本月底之前關閉的票數中減去該計數。

更新: 我已經更新我的查詢與下面的評論,它是不與組錯誤的工作,但我沒有真正理解我想,我在SQL缺乏技能是難辭其咎的邏輯。

我添加了一個SQL小提琴例子向你展示我的查詢:http://sqlfiddle.com/#!3/c9b638/1

所需的輸出:

----------- 
| Jan | 3 | 
----------- 
| Feb | 4 | 
----------- 
| Mar | 0 | 
----------- 
+0

需要更多信息。你有它標記爲VB.NET,但沒有VB代碼。你遇到了什麼問題? – Zhais

+0

我期待將其轉換成VB LINQ。我不確定我如何計算所有月份並在LINQ查詢中計數(循環?)。 – Chuck

回答

1

您的SQL有幾個錯誤。 。 。由CreateDate分組,但您沒有將其作爲子查詢中的列。而且,您在count(*)上沒有列別名。

我想這是你正在嘗試做的:

select DATENAME(MONTH,CreateDate), DATEPART(YEAR,CreateDate), 
     (sum(case when CreateDate < DATEADD(MM, 1, '01/01/2012') then 1 else 0 end) - 
     sum(case when CloseDate < DATEADD(MM, 1, '01/01/2012') then 1 else 0 end) 
     ) 
from tblMaintenanceTicket 
group by DATENAME(MONTH,CreateDate), DATEPART(YEAR,CreateDate) 

您的評論似乎闡明你想要什麼比你更清楚的問題(在這個問題的解釋是埋位)。你需要的是一個數月的驅動程序表,然後將它加入到你的表中。例如:

select mons.yr, mons.mon, count(*) as OpenTickets 
from (select month(CreateDate) as mon, year(CreateDate) as yr, 
      cast(min(CreateDate) as date) as MonthStart, 
      cast(max(CreateDate) as date) as monthEnd 
     from tblMaintenanceTicket 
     group by month(CreateDate), year(CreateDate) 
    ) mons left outer join 
    tblMaintenanceTicket mt 
    on mt.CreateDate <= mons.MonthEnd and 
     (mt.CloseDate > mons.MonthEnd or mt.CloseDate is null) 
group by mons.yr, mons.mon 

我假設記錄是在每一天創建的。這是一種方便,所以我不必考慮使用其他SQL函數獲取每個月的第一天和最後一天。

+0

對不起,這個查詢沒有考慮到我需要的約束。我需要知道「每個月末」有多少張門票是開放的。 我的邏輯如下:計算所有門票在本月的第一個月和結束之間打開。從本月底之前關閉的票數中減去該計數。 http://sqlfiddle.com/#!3/c9b638/1 – Chuck

+0

對不起,我試圖澄清我的原始文章更多。希望它更有意義。對不起,它很混亂。 我會嘗試你的建議。 – Chuck

+0

@Chuck。 。 。不要道歉。寫出明確的問題可能比明確的答案更難。我應該更好地閱讀這個問題。 –

1

如果您的查詢返回你所需要的,然後只需使用DATENAME(MONTH, yourDate)檢索月,按月份分組,年份:

SELECT SUM(*), DATENAME(MONTH,yourDate), DATEPART(YEAR,yourDate) 
FROM 
(
    your actual query here 
) 
GROUP BY DATENAME(MONTH,yourDate), DATEPART(YEAR,yourDate) 
+0

我剛剛發現有一個CreateDate和一個CloseDate,我會在幾分鐘內調整查詢,但你得到的點 –

+0

再次想到,你的問題沒有考慮到'CloseDate',因爲你指定「計算多少門票在每月開放「 –

+0

糟糕......我正在計算在月底有多少張」開放「門票。對不起,沒有打開,但打開「仍然」。 – Chuck