如何进行查询

时间:2013-07-11 06:57:07

标签: sql-server

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

表格结构

  
      
  1. id唯一标识符

  2.   
  3. code varchar(5)Not Null

  4.   
  5. Recording_date日期时间不为空

  6.   
  7. Max_Temp numeric(5,2)Not Null

  8.   
  9. Min_Temp numeric(5,2)Not Null

  10.   

我们在此表中也有一些数据。我们的数据仅适用于2013年和前3个月。 但最重要的是我必须以像

这样的格式返回数据

enter image description here

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

提前致谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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)