(mssql)如何在提取的数据中添加额外的列

时间:2018-07-05 09:01:58

标签: sql-server database ssms sql-server-2017 sql-server-2017-express

我下面有这段代码(在sql server 2017上运行):

Future

下面的屏幕快照还显示了执行代码的结果:

enter image description here

此代码的作用是显示每天进入一座建筑物的人数。数据按2小时分组。

我想做的是添加一列,以显示在我已经使用的相同时间段内,有多少人出了。 下面我给你一个我想做的例子:

enter image description here

请注意,在第六行,我正在使用LIKE运算符(将LIKE'%N <=> PeopleIn%'归因于)。这意味着对于其他列,我将不得不进行类似的选择,但是使用属性类似LIKE'%N <=> PeopleOut%'

我可以使用UNION运算符吗?还有其他更明显或更简单的方法吗?

您的帮助将不胜感激, 谢谢。

2 个答案:

答案 0 :(得分:0)

UNION按执行顺序附加结果集。 解决这个问题,UNION并不是我的首选。

我在您的屏幕快照中看到的是,GONE_OUT和CAME_IN在唯一的日期时间上进行了分组,并且对汇总值进行了分组。 您可能有两个(子)查询,一个用于GONE_OUT,一个用于CAME_IN,然后建立关系。

SELECT *
FROM GONE_OUT AS go 
LEFT JOIN CAME_IN AS ci ON go.timestamp = ci.timestamp

答案 1 :(得分:0)

您可以通过根据活动在CTE中标记servertimestamp字段来完成此操作,然后对标签进行汇总。

WITH selection
AS (
  SELECT 
    servertimestamp
    ,CASE WHEN attributes LIKE '%N<=>PeopleIn%' THEN 1 ELSE 0 END AS PPL_IN
    ,CASE WHEN attributes LIKE '%N<=>PeopleOut%' THEN 1 ELSE 0 END AS PPL_OUT
  FROM eventlog
  WHERE 
    servertimestamp BETWEEN '5/29/2018' AND DATEADD(dd, + 1, '6/29/2019')
    AND 
    (attributes LIKE '%N<=>PeopleIn%'
     OR
     attributes LIKE '%N<=>PeopleOut%')
  ) 
  (
    SELECT 
      DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0) AS TIMESTAMP
      ,SUM(PPL_OUT) AS GONE_OUT
      ,SUM(PPL_IN) AS CAME_IN
    FROM selection
    WHERE DATEPART(hh, servertimestamp) BETWEEN 8
        AND 20
    GROUP BY DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0)
   )
ORDER BY TIMESTAMP