none
数据汇总,急求解 RRS feed

  • 问题

  • 表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



    有精到广,做出自己的特色。

    2012年3月29日 9:45

答案

全部回复

  • 基本上应该是这样,你应该调试下:

    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)

    )

    2012年3月29日 12:44
    版主
  • 基本上应该是这样,你应该调试下:

    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”表中插入一条数据,就调用一次这个“汇总过程”应该怎样实现???

    谢谢了,感激不尽。


    有精到广,做出自己的特色。

    2012年3月30日 2:44
  • 基本上应该是这样,你应该调试下:

    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”表中已经汇总过的,不然会多次插入。应该怎么办???



    有精到广,做出自己的特色。

    2012年3月30日 5:51
  • 基本上应该是这样,你应该调试下:

    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”和“*”是不是一个意思?为什么可以这样写?


    有精到广,做出自己的特色。

    2012年3月30日 6:49
  • 在SQL Server 中, Count(1) 和 Count(*)是一样的,但是Count (1)确切地说应该是PL/SQL 中的语法。所以,显然第一个问题的答案应该是否定的。
    2012年3月31日 0:35
    版主
  • 在SQL Server 中, Count(1) 和 Count(*)是一样的,但是Count (1)确切地说应该是PL/SQL 中的语法。所以,显然第一个问题的答案应该是否定的。
    “PL/SQL”指什么?

    有精到广,做出自己的特色。

    2012年3月31日 1:33
  • It's sql used in Oracle.
    2012年3月31日 1:51