尝试按SQL中的值进行分组

时间:2018-01-10 13:56:11

标签: sql sql-server

我有一个名为TESTTABLE的表

表脚本和一些示例日期

CREATE TABLE Test_Table(
   NODE            VARCHAR(10) NOT NULL PRIMARY KEY
  ,EVENTID         CHAR(255) NOT NULL
  ,TYPE            INTEGER  NOT NULL
  ,FIRSTOCCURRENCE VARCHAR(16) NOT NULL
  ,LASTOCCURRENCE  VARCHAR(16) NOT NULL
  ,TALLY           INTEGER  NOT NULL
  ,TICKETNUMBER    VARCHAR(20)
  ,TIME_DELTA      VARCHAR(5)
);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Washington','ReachabilityProblem',2,'12/13/2017 23:24','12/13/2017 23:24',1,NULL,'1 sec');
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('San Diego','ReachabilityProblem',1,'12/13/2017 23:23','12/13/2017 23:23',1,NULL,NULL);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Richmond','ReachabilityProblem',1,'12/13/2017 14:23','12/13/2017 14:23',1,NULL,NULL);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Richmond','ReachabilityProblem',1,'12/13/2017 23:23','12/13/2017 23:23',1,NULL,NULL);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('New York','ReachabilityProblem',2,'12/13/2017 23:24','12/13/2017 23:24',1,NULL,'1 sec');
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('New York','ReachabilityProblem',2,'12/13/2017 11:32','12/13/2017 11:33',2,NULL,'1 sec');
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('New York','ReachabilityProblem',1,'12/13/2017 16:35','12/13/2017 16:35',1,NULL,NULL);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Landsdown','ReachabilityProblem',2,'12/13/2017 23:24','12/13/2017 23:24',1,NULL,'1 sec');
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Houston','ReachabilityProblem',2,'12/13/2017 14:24','12/13/2017 14:24',1,NULL,'1 sec');
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Houston','ReachabilityProblem',1,'12/13/2017 11:31','12/13/2017 11:32',2,NULL,NULL);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Dallas','ReachabilityProblem',1,'12/13/2017 23:23','12/13/2017 23:23',1,NULL,NULL);
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Dallas','ReachabilityProblem',2,'12/13/2017 23:24','12/13/2017 23:24',1,NULL,'1 sec');
INSERT INTO Test_Table(NODE,EVENTID,TYPE,FIRSTOCCURRENCE,LASTOCCURRENCE,TALLY,TICKETNUMBER,TIME_DELTA) VALUES ('Coco Beach','ReachabilityProblem',1,'12/13/2017 23:23','12/13/2017 23:23',1,NULL,NULL);

我试图获得这个 enter image description here

我试过这个 选择DATEDIFF(Day,GETDATE(),DATEADD(HOUR,15,GETDATE()))

Select
 [NODE]
 ,[EVENTID]
 ,[TYPE]
 ,[FIRSTOCCURRENCE]
 ,LASTOCCURRENCE]
 ,DATEDIFF(Minute, FIrst OCCURENCE, LAST OCCURENCE) as [Outage in MIN]
 ,[TicketNumber]
 ,[Severity]
 ,Tally]

  From
  [XYZ].[XYZ].[XYZ_STATUS]
  Where 
  [FIRST OCCURRENCE] >= DATEADD(hh, -24, GETDATE())

  Group by node;

请帮助新秀

3 个答案:

答案 0 :(得分:1)

  

如果要使用GROUP BY子句,则分组返回一个关系/表,每个组都有一行,因此在SELECT语句中,您只能选择要分组的列并在其上使用聚合函数列,因为其他列不会出现在结果表中。

也许这就是你想要的......

Select 
DATEDIFF (DAY, GETDATE(), DATEADD(Hour, 15, GETDATE())),
 ,Node
 ,EventID
 ,Type
 ,Severity
 ,Tally
      FROM xyz.xyz.xyz_status
GROUP BY Node,EventID,Type,Severity,Tally
  

当我们按两列或更多列分组时,它会说"将它们分组,以便所有具有相同col1和col2的列都在同一组中,然后计算所有聚合函数(Count,Sum,每个组的平均值等等#34;

也许你想要这个......

    SELECT DATEDIFF(minute,(SELECT TOP(1) FIRSTOCCURRENCE FROM 
         xyz.xyz.xyz_status),(SELECT TOP(1) LASTOCCURRENCE FROM 
                                                      xyz.xyz.xyz_status))
    FROM xyz.xyz.xyz_status
      WHERE node = 'Houston';

Here您可以查看 DATEDIFF 功能的更多示例。

答案 1 :(得分:0)

尽管在SQL中编写报告可能是一个坏主意,但这应该会让你走上正轨。我相信你想要做的就是输出。您还可以查看其中一些已弃用的ROLLUP选项。

with data as (
    select
        NODE, EVENTID, TYPE, FIRSTOCCURRENCE, LASTOCCURRENCE,
        DATEDIFF(Minute, FIRSTOCCURRENCE, LASTOCCURRENCE) as OutageInMin,
        TicketNumber, Tally,
        ROW_NUMBER() OVER (PARTITION BY NODE ORDER BY FIRSTOCCURRENCE) as rn
    from Test_Table
    --WHERE FIRSTOCCURRENCE >= DATEADD(hh, -24, GETDATE())
)
select
    case when grouping(rn) = 1 then 'SITE TOTAL' else NODE end as NODE,
    case when grouping(rn) = 1 then null else min(EVENTID) end as EVENTID,
    case when grouping(rn) = 1 then null else min(TYPE) end as TYPE,
    case when grouping(rn) = 1 then null else min(FIRSTOCCURRENCE) end as FIRSTOCCURRENCE,
    case when grouping(rn) = 1 then null else min(LASTOCCURRENCE) end as LASTOCCURRENCE,
    case when grouping(rn) = 1 then null else min(Tally) end as Tally,
    case when grouping(rn) = 1 then null else min(TicketNumber) end as TicketNumber,
    case when grouping(node) = 1
        then min(OutageInMin) else sum(OutageInMin) end as "Outage In MIN"
from
  data
group by grouping sets ( (NODE, rn), (NODE) )
order by data.NODE, grouping(rn), rn;

http://rextester.com/DZIHJ81264

答案 2 :(得分:-1)

只有在聚合某些内容时才会在SQL中授权GROUP BY。最简单的例子是计数。

示例:您想知道EventID链接到给定节点的数量:

SELECT Count(EventId), node FROM xyz.xyz.xyz_status GROUP BY node;

这是一个显示Group By功能的site。如果您澄清了您要搜索的内容,我们将为您提供一个更具体的示例。