问题描述
我有两个表:Tag
和History
,其中Tag
表存储有关所有TagName
和History
表的信息逆变器接收实时数据。
现在,我有14个不同的站点,可以从这些站点获取逆变器的实时日期,如下所示。
SELECT disTINCT TagName
FROM History
WHERE TagName LIKE '%DailykWh'
我正在使用相同的查询,通过将它们与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,如下所示。
如果我对子查询中的所有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
感谢大家的答复和回答。