0

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

表结构

  1. id 唯一标识符

  2. 代码 varchar(5) 非空

  3. Recording_date 日期时间不为空

  4. Max_Temp numeric(5,2) 非空

  5. Min_Temp numeric(5,2) 非空

我们在这个表中也有一些数据。我们只有 2013 年和前 3 个月的数据。但主要的是我必须以这样的格式返回数据

在此处输入图像描述

请帮我为这样的逻辑创建一个查询。

提前致谢。

4

3 回答 3

1

这适用于所有月份数据

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
于 2013-07-11T07:20:01.987 回答
1

假设你每天有一个录音然后

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
于 2013-07-11T07:20:34.897 回答
1
SELECT 
      MONTH(Recording_date),
      SUM(CASE WHEN Max_Temp <= 0 THEN 1 ELSE 0 END), 
      SUM(CASE WHEN Max_Temp <= 0 THEN 1 ELSE 0 END) / COUNT(*),
      SUM( CASE WHEN Min_Temp <= 0 THEN 1 ELSE 0 END ),
      SUM( CASE WHEN Min_Temp <= 0 THEN 1 ELSE 0 END )  / COUNT(*)
FROM temperatures
GROUP BY MONTH(Recording_date)
于 2013-07-11T07:27:03.033 回答