用子查询替换视图

时间:2011-12-05 17:30:44

标签: sql view subquery

我有一张包含这些数据的表格:

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

给了我结果。 ......太复杂了,任何人的想法?

感谢名单

2 个答案:

答案 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))