Sql 组合多个复杂的SELECT语句,使它们显示在一行上

Sql 组合多个复杂的SELECT语句,使它们显示在一行上,sql,sql-server,Sql,Sql Server,我是SQL的新手,所以请温柔一点。我有一个表格,记录了不同地点不同传感器的温度。如果数据库结构更简单的话,我很乐意重新调整它 列为:ID int、SensorID tinyint、LocationID tinyint、TempReadDT datetime、Temp(十进制4,1) 传感器每隔几分钟记录一次读数,我希望有一个存储过程来获取以下信息,并显示在摘要页面上: 当前室内温度(传感器1的最新读数) 当前室外温度(传感器2的最新读数) 过去24小时的平均室内温度 过去7天的平均室内温度 上次

我是SQL的新手,所以请温柔一点。我有一个表格,记录了不同地点不同传感器的温度。如果数据库结构更简单的话,我很乐意重新调整它

列为:ID int、SensorID tinyint、LocationID tinyint、TempReadDT datetime、Temp(十进制4,1)

传感器每隔几分钟记录一次读数,我希望有一个存储过程来获取以下信息,并显示在摘要页面上:

  • 当前室内温度(传感器1的最新读数)
  • 当前室外温度(传感器2的最新读数)
  • 过去24小时的平均室内温度
  • 过去7天的平均室内温度
  • 上次更新日期时间(记录的最新日期)
  • 我已经创建了单独的
    SELECT
    语句(如下),但我不确定如何将它们组合到一个查询中,以便在一行上返回数据

    SELECT TOP 1 Temp AS "intTemp"
      FROM Temperature
     WHERE SensorID = 1
     ORDER BY ID DESC
    
    SELECT TOP 1 Temp AS "extTemp"
      FROM Temperature
     WHERE SensorID = 2
     ORDER BY ID DESC
    
    SELECT AVG(Temp) AS "avgTemp24h"
      FROM Temperature
     WHERE SensorID = 1
       AND TempReadDT >= DATEADD(DAY,-1, SYSDATETIME())
    
    SELECT AVG(Temp) AS "avgTemp7d"
      FROM Temperature
     WHERE SensorID = 1
       AND TempReadDT >= DATEADD(DAY,-7, SYSDATETIME())
    
    SELECT MAX(TempReadDT)
      FROM Temperature
    

    我讨厌交叉连接,但是

    Select * from 
    (SELECT TOP 1 Temp AS "intTemp"
      FROM Temperature
     WHERE SensorID = 1
     ORDER BY ID DESC
    ) A
    cross join
    (SELECT TOP 1 Temp AS "extTemp"
      FROM Temperature
     WHERE SensorID = 2
     ORDER BY ID DESC
    )B
    cross join
    (
    SELECT AVG(Temp) AS "avgTemp24h"
      FROM Temperature
     WHERE SensorID = 1
       AND TempReadDT >= DATEADD(DAY,-1, SYSDATETIME())
    )C
    cross join
    (
    SELECT AVG(Temp) AS "avgTemp7d"
      FROM Temperature
     WHERE SensorID = 1
       AND TempReadDT >= DATEADD(DAY,-7, SYSDATETIME())
    )D 
    cross join
    (
    SELECT MAX(TempReadDT)
      FROM Temperature) E 
    

    应该可以工作。

    例如,您可以使用子查询和别名作为结果

    SELECT 
       Max(case SensorID when 1 then Temp else null end) AS "intTemp",
       Max(case SensorID when 2 then Temp else null end) AS "intTemp",
       AVG(case 
               when SensorID = 1  
                AND TempReadDT >= DATEADD(DAY,-1, SYSDATETIME()) 
               then Temp else null end) AS "avgTemp24h",
       AVG(case 
               when SensorID = 1  
                AND TempReadDT >= DATEADD(DAY,-7, SYSDATETIME()) 
               then Temp else null end) AS "avgTemp7d",
       MAX(TempReadDT) MaxTemp
    FROM Temperature
    
    SELECT t1.col1, t2.col2 from (select * from tbl1) as t1, (select * from tbl2) as t2
    

    如果你展示了原始数据和预期结果,你应该得到更好更快的回答。汉克斯·阿德里安,工作得很好。我将阅读更多关于这个案例的工作原理:)