T-SQL 条件'WHERE'子句和'IN'子句,用于在结果集中包含所有键



我有两个表:TagHistory,其中Tag表存储关于所有TagName的信息,History表存储从逆变器接收的实时数据。

现在,我有14个不同的站点,从中我可以获得逆变器的实时日期,如下所示。

SELECT DISTINCT TagName
FROM History
WHERE TagName LIKE '%DailykWh'

输出

我使用这个相同的查询来查找Value列的SUM(),方法是使用TagName 对它们进行分组

SELECT
TagName,
SUM (Value) Monthly
FROM
History h1
WHERE
TagName IN (
SELECT DISTINCT
h2.TagName
FROM 
History h2
WHERE
h2.TagName LIKE '%DailykWh'
) AND 
DateTime BETWEEN '2020-11-01 00:00:00' AND '2020-11-08 23:59:59'
GROUP BY
TagName
ORDER BY
TagName

但是结果只包括第一个TagName,而不是所有TagName,如下所示。

输出

如果我硬编码子查询中的所有TagNames,那么我将从所有站点获得结果。我不想硬编码它们,有没有其他方法可以将所有网站都包括在查询结果中?

我是T-SQL的新手,我想可能还有其他东西可以代替IN子句,但我不知道是哪一个。任何帮助都将不胜感激,谢谢!

您可以尝试使用join

SELECT
t.TagName,
SUM (Value) Monthly
FROM
Tag t left join History h on h.tagname=t.tagname
WHERE t.TagName LIKE '%DailykWh'
group by 
t.TagName
ORDER BY
t.TagName

并非所有标签都在历史记录表中可用。你可以left join,所以"缺少";标签没有被过滤掉:

select t.tagname, sum(h.value) as monthly
from tag t
left join history h on h.tagname = t.tagname
where t.tagname like '%Dailykwh'
group by t.tagname
order by t.tagname

这将在monthly中为丢失的标签带来null值。如果您想要0,请使用coalesce():

coalesce(sum(h.value), 0) as monthly

根据@SMor给出的响应,我尝试了以下查询,它对我有效。

SELECT
TagName,
SUM (Value) Monthly
FROM
History
WHERE
TagName LIKE '%DailykWh' AND
DateTime BETWEEN '2020-11-01 00:00:00' AND '2020-11-10 23:59:59'
GROUP BY
TagName
ORDER BY
TagName

感谢大家的回复和回答。

最新更新