2011-12-05 59 views
0

我有一个表,这个数据替换观点:与子查询

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宏发生次数。 在2010年1月1日宏核心和左中运行,因此,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

的样本数据:

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)) 
+0

嗨米哈尔, 也许我没能清楚地表达自己。我需要一个具有不同日期的输出,以及每天不同的macroID的总和。即使同一个MacroID的不同功能每天超过一次,它仍然应该只计算一次: DISTINCT MacroID /天的总和 –

+0

我改变了查询,现在它给出了精确的结果集,因为您一直在要求。 –

+0

是的,你做到了:O)谢谢你! –

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

您不需要在第二个查询中按MacroID进行分组。 –

+0

Thx回应。 什么是查询中的测试引用? PS:是的,我正在使用SQL 2008 –

+0

@PetrŠimůnek:对不起,这是一个错字;我纠正了这个例子。 –