【问题标题】:(mssql) How can i add extra columns in extracted data(mssql) 如何在提取的数据中添加额外的列
【发布时间】:2018-07-05 09:01:57
【问题描述】:

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

WITH selection AS (
    SELECT servertimestamp 
    FROM eventlog 
    WHERE servertimestamp BETWEEN '5/29/2018' AND DATEADD(dd, +1, '6/29/2019')

    AND (attributes LIKE '%N<=>PeopleIn%'))
(SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, servertimestamp) - (DATEDIFF(HOUR, 0, servertimestamp) % 2), 0) as timestamp , COUNT(servertimestamp) AS GONE_OUT
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

下面的截图也显示了执行代码的结果:

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

我想要做的是添加一列,显示在我已经使用的相同时间段内走出大楼的人数。 下面我给你一个我想做的例子:

请注意,在第 6 行,我使用了 LIKE 运算符(属性 LIKE '%NPeopleIn%')。这意味着对于附加列,我必须做出类似的选择,但不同的是使用 属性 LIKE '%NPeopleOut%'

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

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

【问题讨论】:

  • 你可以用 UNION 来做,或者你可以用 PIVOT 更干净地做整个事情,我想。不过,我需要花一个小时左右的时间来写出逻辑。

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


【解决方案1】:

您可以通过根据活动标记 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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多