SQL将列除以另一个表中的数字

SQL将列除以另一个表中的数字,sql,Sql,我有两张桌子: total_table = | Title | Value | |-------|-------| | total | 20 | breakdown_table = | Title | Value | |--------|-------| | total | 20 | (this is the same as the above table) | type a | 10 | | type b | 5 | | type c | 5 | 我

我有两张桌子:

total_table = 
| Title | Value |
|-------|-------|
| total |   20  |

breakdown_table =
|  Title | Value |
|--------|-------|
|  total |   20  | (this is the same as the above table)
| type a |   10  |
| type b |    5  |
| type c |    5  |
我想创建一个新表,其中包括
细分\u表
中的两列,但添加第三列,显示细分百分比(100%、50%、25%、25%)。我如何在不硬编码分母的情况下实现这一点

这里有一些我尝试过的语法,但它总是给我关于逗号和equijoin的错误。我不想用键连接表,我只想使用
total\u表中的单个值

data_out = SELECT breakdown_table.*,
                  breakdown_table.Value / total.Value
           FROM breakdown_table, total_table;

您可以交叉联接表(正确):


您可以尝试使用交叉连接:

select t1.Title, t1.Value, 100 * t1.Value / t2.Value AS BPCT
from mytable t1
cross join mytable t2
where t2.Title = "total"

与这里的其他答案非常相似,但将以正确的格式为您提供百分比

select t1.*, format(t1.value/1.0/t2.value,'P0') as pcnt
from breakdown_table t1 cross apply total_table t2
如果希望使用隐式联接方法,则需要更改total_表中的列名

select t1.*,format(value*1.0/total,'P0') as pcnt
from breakdown_table t1,(select value as total from total_table) t2

通常,最好不要存储聚合信息(total
列),尤其不要存储在表中(汇总表有时是必要的,不过最好在可能的情况下将其自动化)。也就是说,我更好奇的是,你在这里似乎具有全球价值……我不太明白。以上只是我的代码片段。你认为哪种价值观是全球性的?您所说的“首选不存储聚合信息”是什么意思?你的意思是我不应该把total_表作为一个单独的表?(另外,为了清楚起见,更改了表名)。除非您有特定的性能问题(通过监视确定,通常是由于表中有1Mil+行的数据库),否则最好避免存储派生信息(包括总计之类的内容),而优先将其作为查询或视图的一部分进行计算。因此,不,您可能不想要
total\u表
,或者细分表中的
total
行;您可能需要一个或多个返回相同信息的视图。在出现故障和并发问题时,维护聚合表是危险的。“全局值”是
total\u表中的数据
——通过按需交叉连接,意味着表中只有一行(而
breakdown\u表
将只有一个“set”行,而不是来自两个不同事务或其他事务的行)。这似乎很奇怪,而且不是数据库中通常使用表的方式(可能作为存储过程中的临时表,但即使如此…)。所以我担心你会陷入困境。
select t1.*,format(value*1.0/total,'P0') as pcnt
from breakdown_table t1,(select value as total from total_table) t2