积极答复者
数据汇总,急求解

问题
-
表WarnCount如下:
表WarnUse如下:
现在想把“WarnUse”中的数据汇总到“WarnCount”中,汇总的规则如下:
1、根据“WarnUse”表的“DATime(datetime)”字段,返回每小时的记录数。
2、比如“WarnUse”表,有记录“2010-07-24 16:00:16.000”和“2010-07-24 19:45:16.000”,这时候“2010-07-24 19:00:00.000”就有两条记录。
3、将“WarnUse”表的“DATime(datetime)”字段分解。“2010072419”插入到“WarnCount”表的“DANo”字段中,“20100724”插入到“WarnCount”表的“DADay”字段中,“19”插入到“DAHour”字段中,返回记录数“2”插入到“SumQty”字段中。
小弟没做过类似的汇总,应该如何实现??? 感激不尽?创建表的SQL语句如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[WarnCount](
[DANo] [char](10) NOT NULL,
[MeterType] [char](4) NULL,
[DADay] [char](8) NOT NULL,
[DAHour] [char](2) NOT NULL,
[SumQty] [int] NOT NULL,
[Qty1] [int] NULL,
CONSTRAINT [PK_WarnCount] PRIMARY KEY CLUSTERED
(
[DANo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[WarnUse](
[MonitorType] [char](4) NOT NULL,
[MeterNo] [char](20) NOT NULL,
[MeterType] [char](4) NOT NULL,
[DATime] [datetime] NOT NULL,
[AlarmCode] [char](4) NULL,
[ResponseAction] [char](1) NULL,
[Note] [nvarchar](500) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
有精到广,做出自己的特色。
答案
-
在SQL Server 中, Count(1) 和 Count(*)是一样的,但是Count (1)确切地说应该是PL/SQL 中的语法。所以,显然第一个问题的答案应该是否定的。
- 已建议为答案 Molly Chen_Moderator 2012年4月2日 3:32
- 已标记为答案 Molly Chen_Moderator 2012年4月5日 1:59
-
It's sql used in Oracle.
- 已建议为答案 Molly Chen_Moderator 2012年4月2日 3:33
- 已标记为答案 Molly Chen_Moderator 2012年4月5日 1:59
全部回复
-
基本上应该是这样,你应该调试下:
INSERT INTO WarnCount (DANo,DADay,DAHour,SumQry) Values
FROM (SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime))) AS DANo_Org,
CONVERT(Varchar(10),DATime,112) AS DADay_Org, DatePart(Hour,DATime) AS DAHour, Count(*) AS SumQry_Org FROM WarnUSE GROUP BY
SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime)),
CONVERT(Varchar(10),DATime,112),
DatePart(Hour,DATime)
)
-
基本上应该是这样,你应该调试下:
INSERT INTO WarnCount (DANo,DADay,DAHour,SumQry) Values
FROM (SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime))) AS DANo_Org,
CONVERT(Varchar(10),DATime,112) AS DADay_Org, DatePart(Hour,DATime) AS DAHour, Count(*) AS SumQry_Org FROM WarnUSE GROUP BY
SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime)),
CONVERT(Varchar(10),DATime,112),
DatePart(Hour,DATime)
)
谢谢您,谢谢。
关于它的汇总原理是不是如下:
1、用“convert”进行字段转化,根据“DATime”字段分组。
2、“count(1)”组数。
问题一:“count(1)”可以用来汇总“group by”之后的组数么?
问题二:如果再给“WarnUse”表加一个触发器,每当“WarnUse”表中插入一条数据,就调用一次这个“汇总过程”应该怎样实现???
谢谢了,感激不尽。有精到广,做出自己的特色。
-
基本上应该是这样,你应该调试下:
INSERT INTO WarnCount (DANo,DADay,DAHour,SumQry) Values
FROM (SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime))) AS DANo_Org,
CONVERT(Varchar(10),DATime,112) AS DADay_Org, DatePart(Hour,DATime) AS DAHour, Count(*) AS SumQry_Org FROM WarnUSE GROUP BY
SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime)),
CONVERT(Varchar(10),DATime,112),
DatePart(Hour,DATime)
)
自己写了下,但是不对,如下:
alter trigger tri_warnsummary on WarnUse
for insert
as
insert into WarnCount(metertype,DADay,DANo,DAHour,SumQty)
select u.metertype,convert(varchar(8),u.DATime,112),(convert(varchar(8),u.DATime,112)+convert(varchar(2),u.DATime,108)) DANo,convert(varchar(2),u.DATime,108),count(1)
from WarnUse u left join WarnCount c on c.DANo!= u.DANo
group by u.metertype,convert(varchar(8),u.DATime,112),u.DANo,convert(varchar(2),u.DATime,108)
其中的汇总过程:
insert into WarnCount(metertype,DADay,DANo,DAHour,SumQty)
select u.metertype,convert(varchar(8),u.DATime,112),(convert(varchar(8),u.DATime,112)+convert(varchar(2),u.DATime,108)) DANo,convert(varchar(2),u.DATime,108),count(1)
from WarnUse u left join WarnCount c on c.DANo!= u.DANo
group by u.metertype,convert(varchar(8),u.DATime,112),u.DANo,convert(varchar(2),u.DATime,108)
提示错误:
消息 207,级别 16,状态 1,第 3 行
列名 'DANo' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'DANo' 无效。
简单的讲就是:
要从“WarnUse”表中排除“WarnCount”表中已经汇总过的,不然会多次插入。应该怎么办???
有精到广,做出自己的特色。
-
基本上应该是这样,你应该调试下:
INSERT INTO WarnCount (DANo,DADay,DAHour,SumQry) Values
FROM (SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime))) AS DANo_Org,
CONVERT(Varchar(10),DATime,112) AS DADay_Org, DatePart(Hour,DATime) AS DAHour, Count(*) AS SumQry_Org FROM WarnUSE GROUP BY
SELECT CONVERT(Varchar(10),DATime,112) + CONVERT(CHAR(2),DatePart(Hour,DATime)),
CONVERT(Varchar(10),DATime,112),
DatePart(Hour,DATime)
)
改过来了,这样写就好了,但是还有点疑问,如下:
alter trigger tri_warnsummary on WarnUse
for insert
as
insert into WarnCount(metertype,DADay,DANo,DAHour,SumQty)
select metertype,convert(varchar(8),DATime,112),convert(varchar(8),DATime,112)+convert(varchar(2),DATime,108),convert(varchar(2),DATime,108),count(1)
from WarnUse m where not exists(select 1 from WarnCount n where n.metertype = m.metertype and n.DADay = convert(varchar(8),m.DATime,112) and n.DANo = convert(varchar(8),m.DATime,112)+convert(varchar(2),DATime,108) and n.DAHour = convert(varchar(2),m.DATime,108))
group by metertype,convert(varchar(8),DATime,112),convert(varchar(8),DATime,112)+convert(varchar(2),DATime,108),convert(varchar(2),DATime,108)问题一:“count(1)”可以用来汇总“group by”之后的组数么?
问题二:“count(1)”和“select 1”中的“1”和“*”是不是一个意思?为什么可以这样写?
有精到广,做出自己的特色。
-
在SQL Server 中, Count(1) 和 Count(*)是一样的,但是Count (1)确切地说应该是PL/SQL 中的语法。所以,显然第一个问题的答案应该是否定的。
- 已建议为答案 Molly Chen_Moderator 2012年4月2日 3:32
- 已标记为答案 Molly Chen_Moderator 2012年4月5日 1:59
-
It's sql used in Oracle.
- 已建议为答案 Molly Chen_Moderator 2012年4月2日 3:33
- 已标记为答案 Molly Chen_Moderator 2012年4月5日 1:59