[英]SQL Server Query Accumulating Total
我創建了一個存儲事件票證的數據庫。 我有一個事實表和許多維表。
這是一些示例數據
+---------------------+--------------+--------------+-------------+------------+
| LastModifiedDateKey | TicketNumber | Status | factCurrent | Date |
+---------------------+--------------+--------------+-------------+------------+
| 2774 | T:9992260 | Open | 1 | 4/12/2017 |
| 2777 | T:9992805 | Open | 1 | 7/12/2017 |
| 2777 | T:9993068 | Open | 1 | 7/12/2017 |
| 2777 | T:9993098 | Open | 0 | 7/12/2017 |
| 2793 | T:9993098 | Acknowledged | 0 | 23/12/2017 |
| 2928 | T:9993098 | Closed | 1 | 5/01/2018 |
| 2777 | T:9993799 | Open | 0 | 7/12/2017 |
| 2928 | T:9993799 | Closed | 1 | 5/01/2018 |
| 2778 | T:9994729 | Open | 1 | 8/12/2017 |
| 2774 | T:9994791 | Open | 0 | 4/12/2017 |
| 2928 | T:9994791 | Closed | 1 | 5/01/2018 |
| 2777 | T:9994912 | Open | 1 | 7/12/2017 |
| 2778 | T:9995201 | Open | 0 | 8/12/2017 |
| 2793 | T:9995201 | Closed | 1 | 23/12/2017 |
| 2931 | T:9718629 | Open | 1 | 8/01/2018 |
| 2933 | T:9718629 | Closed | 1 | 10/01/2018 |
| 2932 | T:9855664 | Open | 1 | 9/01/2018 |
| 2931 | T:9891975 | Open | 1 | 8/01/2018 |
+---------------------+--------------+--------------+-------------+------------+
我想要一個查詢,該查詢將給我每個月底開放的門票總數。
在數據中,12月(結束日期)的計數應為8,而1月的計數應為10。注意:票證可以具有相同狀態的多行,因為維度鍵已更改或同一月中具有不同狀態的多行。 例如T:9993098。 如果我將'2018-01-01'更改為'2018-02-01',則此查詢將提供DEC的計數。
SELECT count(DISTINCT TicketNumber)
FROM [dbo].[factTicket] ft
INNER JOIN dimDate dd ON ft.LastModifiedDateKey = dd.dateKey
WHERE DATE < '2018-01-01'
AND TicketNumber NOT IN
(
SELECT DISTINCT TicketNumber
FROM [dbo].[factTicket] ft
INNER JOIN dimDate dd ON ft.LastModifiedDateKey = dd.dateKey
WHERE STATUS = 'closed'
AND DATE < '2018-01-01'
)
您可以嘗試在日期列上使用MONTH()
進行分組,如下所示
SELECT COUNT(DISTINCT TicketNumber),MONTH(Date) FROM [dbo].[factTicket]
WHERE Status = 'Open'
GROUP BY MONTH(Date)
這可以用累計和來完成。
with cte(LastModifiedDateKey, TicketNumber, Status, factCurrent, Date) as (
select a, b, c, d, cast(e as datetime) from (values
(2774,'T:9992260','Open',1,'4/12/2017')
,(2777,'T:9992805','Open',1,'7/12/2017')
,(2777,'T:9993068','Open',1,'7/12/2017')
,(2777,'T:9993098','Open',0,'7/12/2017')
,(2793,'T:9993098','Acknowledged',0,'23/12/2017')
,(2928,'T:9993098','Closed',1,'5/01/2018')
,(2777,'T:9993799','Open',0,'7/12/2017')
,(2928,'T:9993799','Closed',1,'5/01/2018')
,(2778,'T:9994729','Open',1,'8/12/2017')
,(2774,'T:9994791','Open',0,'4/12/2017')
,(2928,'T:9994791','Closed',1,'5/01/2018')
,(2777,'T:9994912','Open',1,'7/12/2017')
,(2778,'T:9995201','Open',0,'8/12/2017')
,(2793,'T:9995201','Closed',1,'23/12/2017')
,(2931,'T:9718629','Open',1,'8/01/2018')
,(2933,'T:9718629','Closed',1,'10/01/2018')
,(2932,'T:9855664','Open',1,'9/01/2018')
,(2931,'T:9891975','Open',1,'8/01/2018')) t(a,b,c,d,e)
)
select
mon, iif(min(cs) > 0, 0, abs(min(cs)))
from (
select
TicketNumber, status, eomonth(date) mon
, sum(iif(status = 'Closed', 1, -1)) over (order by eomonth(date), status rows unbounded preceding) cs
from
cte
where
status in ('Open','Closed')
group by TicketNumber, status, eomonth(date)
) t
group by mon
輸出:
+---------------+-------+
| mon | cnt |
| 2017-12-31 | 8 |
| 2018-01-31 | 7 |
+---------------+-------+
我不知道你為什么期望一月份有10個。 您的樣本數據中只有7張公開門票
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.