【发布时间】:2021-02-21 03:58:06
【问题描述】:
我有两个表:Tag 和History,其中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 子句,但我不知道是哪一个。任何帮助将不胜感激,谢谢!
【问题讨论】:
-
TagName 列是什么类型 - char 或 varchar?这可以对 LIKE 运算符产生影响。
-
@Arvo TagName 列是“nvarchar”数据类型。
-
@Sai,您好,您确定所有 Value 字段都包含非空数据吗?
-
为什么你需要一个包含来自同一个表的值的子查询?这与在 WHERE 子句中使用
h1.TagName LIKE '%DailykWh'不完全相同吗?但似乎您的日期过滤器匹配的行数很少。运行一些简单的查询以查看在该时间段内是否存在多个标签的任何行。 -
@SMor 您的解决方案对我来说效果很好。我用你提到的 WHERE 子句中的附加条件替换了子查询,并且使用
DateTime列我能够得到我想要的结果。非常感谢!
标签: sql sql-server where-clause in-clause