【发布时间】:2013-03-29 19:28:57
【问题描述】:
我不得不重新编写一个项目,该项目是在 ColdFusion 中使用 SQL 查询和 Query-of-Queries 组合完成的。有几十个查询引用了原始 SQL 查询结果集,但它没有被抽象为适用于不同的事件。所以我想通过将大部分计数转移到 SQL 中来改进它。我得到了他们需要工作的前 6 个计数(不确定是否以最佳方式)。但是,除此之外,我不仅需要对整个日期范围进行细分,而且还需要对该日期范围内的每一天进行细分,以获取唯一计数。
目前的查询是:
SELECT Count(CASE
WHEN type IN ( 1, 3, 4, 5, 9 ) THEN barcode
ELSE NULL
END) AS total_scans,
Count(CASE
WHEN type IN ( 2, 8 ) THEN barcode
ELSE NULL
END) AS total_creds,
Count(barcode) AS total_scans,
Count(DISTINCT CASE
WHEN type IN ( 1, 3, 4, 5, 9 ) THEN barcode
ELSE NULL
END) AS unique_scans,
Count(DISTINCT CASE
WHEN type IN ( 2, 8 ) THEN barcode
ELSE NULL
END) AS unique_creds,
Count(DISTINCT barcode) AS unique_scans
FROM (SELECT c.id,
a.barcode,
d.type,
c.location,
Datepart(mm, a.scan_time) AS scan_month,
Datepart(dd, a.scan_time) AS scan_day,
Datepart(hour, a.scan_time) AS scan_hour,
Datepart(minute, a.scan_time) AS scan_min
FROM [scan_11pc_gate_entries] AS a
INNER JOIN scan_units AS b
ON a.scanner = b.id
INNER JOIN scan_gates AS c
ON b.gate = c.id
INNER JOIN [scan_11pc_gate_allbarcodes] AS d
ON a.barcode = d.barcode
WHERE ( c.id IN (SELECT id
FROM scan_gates
WHERE ( event_id = 21 )) )
AND ( a.valid IN ( 1, 8 ) )
AND a.scan_time >= '20110808'
AND a.scan_time <= '20110814') data
【问题讨论】:
-
scan_11pc_gate_entries.scan_time的数据类型是什么?您是否发现像a、b、c等无意义的别名可读? -
获取核心数据的内部查询不是我写的,数据类型是datetime。我想我也可以重写内部查询,但我真的只需要计数
-
嗯,按天获取计数的最简单方法至少需要对内部查询稍作更改,除非您想按这些分隔的日/月/年列进行分组。你试过我的答案了吗?
标签: sql-server sql-server-2005 count date-range