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

感谢大家的答复和回答。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...