簡體   English   中英

使用日期時間MSSQL查詢創建統計表

[英]create a statistics table using datetime MSSQL Query

我的桌子很少,給我帶來了很大的困難:

Person    datetime1                   datetime2
Eric      2012-10-01 09:00:05.000     2012-10-01 22:00:00.000
Anna      2012-10-02 06:00:05.000     2012-10-03 12:00:05.000
Richard   2012-10-03 09:00:05.000     2012-10-04 02:00:05.000
Chuck     2012-10-01 12:00:05.000     2012-10-01 23:00:05.000

我正在嘗試編寫查詢,該查詢為我提供了統計表。 下表包含有關用戶何時登錄和注銷的信息(每日粒度):

Date        logged_in  logged_off
2012-10-01  2          2
2012-10-02  1          0
2012-10-03  1          1
2012-10-04  0          1

根據我的研究,樞軸命令可以解決問題嗎?

select Person,
SUM(case when datetime1 = '2012-10-01' then 1 else 0 end) as [loggeed_in],
SUM(case when datetime2 = '2012-10-01'  then 1 else 0 end) as [logged_of]
from table
group by Person

這行不通...您有任何想法嗎?

這將解決當前查詢,但是不知道是否可以解決整個問題...

select Person,
SUM(case when convert(varchar(10), datetime1, 111) = '2012/10/01' then 1 else 0 end) as [loggeed_in],
SUM(case when convert(varchar(10), datetime2, 111) =  '2012/10/01'  then 1 else 0 end) as [logged_of]
from table
group by Person

編輯:我相信這將更適合需求...

SELECT 
    [Date] = dt,
    logged_in = (
        SELECT COUNT(*)
        FROM table1
        WHERE convert(varchar(10), datetime1, 111) = convert(varchar(10), dt, 111)),
    logged_off = (
        SELECT COUNT(*)
        FROM table1
        WHERE convert(varchar(10), datetime2, 111) = convert(varchar(10), dt, 111))
FROM (
    SELECT TOP 1000
        row_number() OVER(ORDER BY (SELECT 0)) AS N
        FROM master.dbo.syscolumns sc1, master.dbo.syscolumns sc2) tally
    CROSS APPLY(
        SELECT dt = DATEADD(dd, tally.N - 1, '2012-10-1')) tallydt
WHERE dt BETWEEN (SELECT MIN(dateadd(dd, -1, datetime1)) FROM table1) AND (SELECT MAX(datetime2) FROM table1)
GROUP BY dt 
ORDER BY dt

這是有效的解決方案:

WITH O AS (
SELECT
CAST([login Date & Time] AS DATE) loginDate
,COUNT(*) logined
 FROM table
 GROUP BY CAST([login Date & Time] AS DATE)
 ), C AS (
SELECT 
CAST([Close Date & Time] AS DATE) CloseDate
,COUNT(*) Closed
 FROM table
WHERE [Close Date & Time] IS NOT NULL
GROUP BY CAST([Close Date & Time] AS DATE)
 )
 SELECT
COALESCE(C.CloseDate, O.loginDate) TheDate
--,O.loginDate
--,C.CloseDate
,O.logined
,C.Closed
  FROM O 
  FULL JOIN C
 ON O.loginDate = C.CloseDate
 ORDER BY TheDate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM