T-SQL条件“ WHERE”子句和“ IN”子句在结果集中包括所有键

问题描述

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

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

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

Output

我正在使用相同的查询,通过将它们与TagName分组来在SUM()列中找到Value

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,如下所示。

Output

如果我对子查询中的所有TagName进行硬编码,那么我将从所有站点获取结果。我不想对其进行硬编码,是否还有其他方法可以将所有网站都包含在查询结果中?

我是T-sql的新手,我认为也许还有其他可以代替IN子句使用的东西,但是我不知道哪个。任何帮助将不胜感激,谢谢!

解决方法

您可以尝试使用加入

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

这将为丢失的标签在null中引入monthly值。如果您想使用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

感谢大家的答复和回答。