Sql server 如何对此进行查询

Sql server 如何对此进行查询,sql-server,Sql Server,我有一个表结构,从那里我必须以不同的方式进行查询 表结构 id唯一标识符 代码varchar5不为空 记录日期日期时间不为空 最大温度数值5,2不为空 最小温度数值5,2不为空 本表中也有一些数据。我们只有2013年和前3个月的数据。 但最重要的是,我必须以如下格式返回用户的数据 请帮助我为这种逻辑创建一个查询 提前感谢。这适用于所有月份数据 DECLARE @maxTempratureTable table(monthName varchar(20), [No. of days Max<

我有一个表结构,从那里我必须以不同的方式进行查询

表结构

id唯一标识符

代码varchar5不为空

记录日期日期时间不为空

最大温度数值5,2不为空

最小温度数值5,2不为空

本表中也有一些数据。我们只有2013年和前3个月的数据。 但最重要的是,我必须以如下格式返回用户的数据

请帮助我为这种逻辑创建一个查询


提前感谢。

这适用于所有月份数据

DECLARE @maxTempratureTable table(monthName varchar(20), [No. of days Max<=0] int,[Percentage Max <=0] float)
  INSERT INTO maxTempratureTable 
  SELECT RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8) , 
           COUNT(*) ,
           COUNT(*) / DAY(DATEADD(mm,DATEDIFF(mm,-1,Recording_date),-1)) * 100 

    FROM tablename
    WHERE Max_Temp <=0
    GROUP BY RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8)

DECLARE @minTempratureTable table(monthName varchar(20), [No. of days Min<=0] int,[Percentage Min<=0] float)
  INSERT INTO @minTempratureTable 
  SELECT RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8) , 
           COUNT(*) ,
           COUNT(*) / DAY(DATEADD(mm,DATEDIFF(mm,-1,Recording_date),-1)) * 100 

    FROM tablename
    WHERE Min_Temp <=0
    GROUP BY RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8)


SELECT * FROM @minTempratureTable min
INNER JOIN @maxTempratureTable max
ON min.monthName = max.monthName

这适用于所有月份的数据

DECLARE @maxTempratureTable table(monthName varchar(20), [No. of days Max<=0] int,[Percentage Max <=0] float)
  INSERT INTO maxTempratureTable 
  SELECT RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8) , 
           COUNT(*) ,
           COUNT(*) / DAY(DATEADD(mm,DATEDIFF(mm,-1,Recording_date),-1)) * 100 

    FROM tablename
    WHERE Max_Temp <=0
    GROUP BY RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8)

DECLARE @minTempratureTable table(monthName varchar(20), [No. of days Min<=0] int,[Percentage Min<=0] float)
  INSERT INTO @minTempratureTable 
  SELECT RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8) , 
           COUNT(*) ,
           COUNT(*) / DAY(DATEADD(mm,DATEDIFF(mm,-1,Recording_date),-1)) * 100 

    FROM tablename
    WHERE Min_Temp <=0
    GROUP BY RIGHT(CONVERT(VARCHAR, Recording_date, 106), 8)


SELECT * FROM @minTempratureTable min
INNER JOIN @maxTempratureTable max
ON min.monthName = max.monthName

假设你每天有一次录音

SELECT
    DATEPART(m, Month_Start) + ' ' + DATEPART(yyyy, Month_Start)
    , Max_Temp_Days
    , CASE
        WHEN Denominator = 0 THEN 0
        ELSE (Max_Temp_Days / Denominator) * 100
      END AS Percent_Max_Temp_Days
    , Min_Temp_Days
    , CASE
        WHEN Denominator = 0 THEN 0
        ELSE (Min_Temp_Days / Denominator) * 100
      END AS Percent_Max_Temp_Days
FROM (
    SELECT 
        DATEADD(MONTH, DATEDIFF(MONTH, 0, Recording_Date), 0) Month_Start
        , Sum(CASE WHEN Max_Temp <= 0 THEN 1 END) Max_Temp_Days
        , Sum(CASE WHEN Min_Temp <= 0 THEN 1 END) Min_Temp_Days
        , COUNT(*) Denominator
    FROM TemperatureRecordings
    WHERE Recording_Date BETWEEN '2013-01-01' AND '2013-03-31'
    GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Recording_Date), 0)
) t
ORDER BY Month_Start

假设你每天有一次录音

SELECT
    DATEPART(m, Month_Start) + ' ' + DATEPART(yyyy, Month_Start)
    , Max_Temp_Days
    , CASE
        WHEN Denominator = 0 THEN 0
        ELSE (Max_Temp_Days / Denominator) * 100
      END AS Percent_Max_Temp_Days
    , Min_Temp_Days
    , CASE
        WHEN Denominator = 0 THEN 0
        ELSE (Min_Temp_Days / Denominator) * 100
      END AS Percent_Max_Temp_Days
FROM (
    SELECT 
        DATEADD(MONTH, DATEDIFF(MONTH, 0, Recording_Date), 0) Month_Start
        , Sum(CASE WHEN Max_Temp <= 0 THEN 1 END) Max_Temp_Days
        , Sum(CASE WHEN Min_Temp <= 0 THEN 1 END) Min_Temp_Days
        , COUNT(*) Denominator
    FROM TemperatureRecordings
    WHERE Recording_Date BETWEEN '2013-01-01' AND '2013-03-31'
    GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Recording_Date), 0)
) t
ORDER BY Month_Start

这是什么输出?总结一下?月数不变吗?仅限1月/2月/3月?一些澄清问题:1哪个Sql Server版本?2每天是否可以有多个记录?3日之间是否存在间隔,即某些日期没有记录,如果是这样的话,这会对%的计算产生什么影响?@Nithesh yes必须显示所有的摘要,但我刚才提到的格式除外。我们必须根据月数从记录日期列中提取月份,我们假设前3个月有一个小条目。这些列呢。最大温度时的天数此输出用于什么?总结一下?月数不变吗?仅限1月/2月/3月?一些澄清问题:1哪个Sql Server版本?2每天是否可以有多个记录?3日之间是否存在间隔,即某些日期没有记录,如果是这样的话,这会对%的计算产生什么影响?@Nithesh yes必须显示所有的摘要,但我刚才提到的格式除外。我们必须根据月数从记录日期列中提取月份,我们假设前3个月有一个小条目。这些列呢。max tempit没问题,谢谢,但我想得到monthname而不是monthnumber,而不是DATEADDMONTH,DATEDIFFMONTH,0,Recording_Date,0[Month_Start],我必须使用datenamemonth,Recording_Date[Month_Start],但当我使用它时,它失败了,在这种情况下,请大家看一下,也可以看一下格式化日期。我在select和group by子句中使用datenamemonth,记录“\u Date+”,“+datenameyear,记录”\u Date“monthname”,现在我得到了monthname with year,但这次我遇到了按顺序排序的问题,但还是要谢谢。没关系,谢谢,但我想得到monthname而不是monthnumber,而不是DATEADDMONTH,DATEDIFFMONTH,0,Recording_Date,0[Month_Start]我必须使用datenamemonth,Recording_Date[Month_Start],但当我使用它时,它失败了,在这种情况下,请大家看一下,也可以看一下格式化日期。我在select和group by子句中使用datenamemonth,记录“\u Date+”,“+datenameyear,记录”\u Date“monthname”,现在我得到了monthname with year,但这次我遇到了按顺序排序的问题,但是仍然谢谢。谢谢亲爱的,但是我想用monthname代替月号。谢谢亲爱的,但是我想用monthname代替月号。