首页 > 解决方案 > 报告 - 按周数和年份的 SQL 组

问题描述

我有一个包含varchar(255)、datetime、 floattemperatures列的表。我想创建一个包含 3 个参数的报告:和。mac_addresstmtemperaturemac_addressweek_numberyear

报告应显示maximum temperaturemac_address某些week_number(01,... 50,...)中的某些year。某些可能有超过 1 行week_number并且year...

数据集的 SQL 查询可能类似于

select max(temperature), mac_address, tm
from temperatures
group by mac_address
having mac_address = @mac_address and week_number = @week_number and year = @year

你知道如何正确构造查询吗?也许我还需要 3 个数据集。对于@mac_address 参数,这很容易。我会

select distinct mac_address from temperatures

但是如何使用 @week_number 和 @year 参数来做到这一点?是手动添加下拉列表值的唯一选择吗?

可能的结果可能是:当用户从参数 mac_address001、47week_numberyear2019中选择时

max_temperature | tm
27.8              t1
27.8              t2
27.8              t3

现在它返回 3 行。大多数时候只有一排。

标签: tsqlreporting-services

解决方案


对于构建年份参数的数据集,您可以使用类似这样的方法,这将使您获得 10 年。您可以根据需要扩展:

;WITH years AS (

    SELECT YEAR(DATEADD(YY,-5,GETDATE())) AS yr

    UNION ALL

    SELECT yr + 1
    FROM years
    WHERE yr < YEAR(DATEADD(YY,5,GETDATE()))

)

SELECT *
FROM years

对于 week 参数,您可以对它们进行硬编码或使用类似的东西:

;WITH weeks AS (

    SELECT 1 AS wk

    UNION ALL

    SELECT wk + 1
    FROM weeks
    WHERE wk < 52

)

SELECT *
FROM weeks

在您的主要 SQL 数据集中,您可能希望使用以下内容:

select max(temperature), mac_address, tm
from temperatures
where mac_address = @mac_address 
  and week_number = @week_number 
  and year = @year
group by mac_address, tm

编辑tmSELECT和中删除GROUP BY

select max(temperature), mac_address
from temperatures
where mac_address = @mac_address 
  and week_number = @week_number 
  and year = @year
group by mac_address

推荐阅读