我有一张包含这些数据的表格:
ID | Date | MacroID | FunctionID
---------------------------------------
1 | 1.1.2010 10:00 | core | coreP1
2 | 2.1.2010 11:11 | main | mainP7
3 | 1.1.2010 17:01 | core | coreP2
4 | 3.1.2011 21:00 | top | topP7
5 | 1.1.2010 11:11 | left | leftP0
我需要得到:
Date | Sum_Macro |
----------------------
1.1.2010 | 2
2.1.2010 | 1
3.1.2010 | 1
其中: 对于任何DISTINCT日期(剥离时间)我需要一个DISTINCT宏出现的总和。 在1.1.2010,宏核心和左边运行,所以2 ...等等
我可以使用视图执行此操作,但我确信有更简单的方法:
CREATE VIEW Days_Macros AS
SELECT DISTINCT MacroID, COUNT(MacroID) AS MacroCnt, CONVERT(varchar, tStamp, 103) AS x
FROM TRADStatMacro
GROUP BY MacroID, CONVERT(varchar, tStamp, 103)
给了我:
MacroID | MacroCnt | x
------------------------------
core | 2 | 1.1.2010
main | 1 | 2.1.2010
top | 1 | 3.1.2010
left | 1 | 1.1.2011
而不是:
SELECT DISTINCT X, COUNT(MacroCnt) AS Y FROM Test
GROUP BY X
给了我结果。 ......太复杂了,任何人的想法?
感谢名单
答案 0 :(得分:0)
我倾向于为此目的成为CTE的粉丝(基本上是内联视图)。看起来你正在使用SQL Server,所以你可以这样做:
WITH counts AS
(
SELECT DISTINCT MacroID, COUNT(MacroID) AS MacroCnt, CONVERT(varchar, tStamp, 103) AS x
FROM TRADStatMacro
GROUP BY MacroID, CONVERT(varchar, tStamp, 103)
)
SELECT DISTINCT X, COUNT(MacroCnt) AS Y FROM counts
GROUP BY X
问题:你的意思是第二个COUNT()
实际上是SUM()
吗?
但您的查询可以简化。如果您已经按照使记录唯一的列进行分组,则不需要DISTINCT
。除了汇总MacroId
函数之外,您没有使用COUNT()
字段,因此您可以将其消除,并可能将所有内容简化为:
SELECT CONVERT(varchar, tStamp, 103) AS X, COUNT(MacroID)
FROM TRADStatMacro
GROUP BY MacroID, CONVERT(varchar, tStamp, 103)
答案 1 :(得分:0)
示例数据:
if object_id('tempdb..#tab') is not null drop table #tab
create table #tab (
id int,
date datetime,
macroId varchar(6),
fynctionId varchar(10)
)
insert into #tab
select 1 , '1.1.2010 10:00', 'core', 'coreP1' union
select 2 , '2.1.2010 11:11', 'main', 'mainP7' union
select 3 , '1.1.2010 17:01', 'core', 'coreP2' union
select 4 , '3.1.2011 21:00', 'top ', 'topP7' union
select 5 , '1.1.2010 11:11', 'left', 'leftP0'
查询(编辑,澄清后):
select
dateadd(dd, 0, datediff(dd, 0, date)) as Date,
count(distinct MacroId) as Sum_Macro
from #tab
group by dateadd(dd, 0, datediff(dd, 0, date))