我终于成功地总结了两个sql sum查询的结果。这个家伙的一小步:)
我的问题与代码中的最后一个字符(Z)有关:
SELECT SUM(hr)
FROM (SELECT SUM(amount) AS hr
FROM Try_again.dbo.tuesday_practice_database
WHERE account_name LIKE 'concessions'
UNION
SELECT SUM(amount) AS hr
FROM Try_again.dbo.tuesday_practice_database
WHERE account_name LIKE 'salaries')Z
除非在右括号后面有某些内容,否则代码将无效。
我只是好奇为什么会这样,为什么需要跟随一个角色。
似乎角色是什么并不重要,代码会起作用。但如果我把它留空,代码就会中断。
谢谢
答案 0 :(得分:3)
SELECT sum(hr)
FROM
(
Select sum(amount) as hr
from Try_again.dbo.tuesday_practice_database
where account_name like 'concessions'
union
Select sum(amount) as hr
from Try_again.dbo.tuesday_practice_database
where account_name like 'salaries'
) z
要更好地理解,请查看以上版本的查询。它是相同的代码,只是重新格式化以帮助说明正在发生的事情。如果您注意到,父FROM
子句将从子查询中检索数据。在此上下文中,SQL要求子查询具有某种名称,因此将z
添加为别名以满足该要求。你可以在那里放任何你想要的东西,但由于这个名字对我们来说并不重要,所以单个字母的占位符很好。
就像下面的查询一样:
select * from table1 as z
顺便说一下,你没有在LIKE
条款中使用通配符!我想你应该重新编写如下的查询:
select sum(hr) from
(
Select sum(amount) as hr from Try_again.dbo.tuesday_practice_database
where account_name like '%concessions&'
union all
Select sum(amount) as hr from Try_again.dbo.tuesday_practice_database
where account_name like '%salaries%'
) AS z
如果您不想使用通配符,则应避免使用LIKE
使用IN
代替并重写这个简单的:
Select sum(amount) from Try_again.dbo.tuesday_practice_database
where account_name in('concessions', 'salaries')
答案 1 :(得分:2)
这样做:
SELECT SUM(amount) as hr
FROM Try_again.dbo.tuesday_practice_database
WHERE account_name IN ('concessions', 'salaries')
现有代码有一个错误,如果它们的数量相同,它将合并你的两个SUM()。您也可以使用UNION ALL
而非UNION
来解决此问题,但由于LIKE
条件没有任何占位符,例如%
或_
,我们可以做更好地将整个事情简化为一个IN()
条件,不需要任何子查询。
现在,如果您希望在匹配中允许更多差异(即LIKE '%concessions%'
和LIKE '%salaries%'
),那么UNION ALL
会更有帮助...只需要警告前导{{ 1}} %
条件下的占位符非常糟糕以提高性能,应尽可能避免使用。这通常意味着以某种方式更改架构,例如添加一个名为LIKE
的表格,将每个帐户分组到一个特定的类别中,您可以在查询中准确定位。
但所有这一切都是在解决实际问题:AccountCategories
字符是什么?
在这种情况下,它是别名。您正在使用子查询将两个较小的查询合并在一起。在某些上下文中,SQL语言要求子查询具有名称。这包括使用子查询(派生表)作为z
,FROM
或JOIN
表达式的目标。您可以使用任何您想要的名称 - 它与查询的功能无关,因为它永远不会再次引用 - 因此一个简单的单字母占位符(如APPLY
)就足够了。