SQL在另一张表中通过一个数字来分割列

4

我有两张表:

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  |

我想创建一个新的表,其中包括来自breakdown_table的两列,但添加第三列显示分解百分比(100%,50%,25%,25%)。如何在不硬编码分母的情况下完成这个操作?
以下是我尝试过的一些语法,但它一直给我关于逗号和等值连接的错误。我不想使用键连接表,我只想使用total_table中的单个值。
data_out = SELECT breakdown_table.*,
                  breakdown_table.Value / total.Value
           FROM breakdown_table, total_table;

通常来说,最好不要存储聚合信息(总计列),尤其是不要在表中存储(虽然偶尔需要卷积表,但在可能的情况下最好自动化)。话虽如此,我更想知道你似乎在这里有一个全局值的事实... - Clockwork-Muse
我不太明白。上面只是我的代码片段。你认为哪个值是全局的?另外,你说的“更喜欢不存储聚合信息”是什么意思?你是指我不应该将total_table作为单独的表格吗?(此外,为了清晰起见,我已更改了表格名称)。 - wheeeee
除非您有特定的性能问题(通过监视识别,通常是由于表中有100万行以上的数据库),否则最好避免存储派生信息(包括总计等内容),而是优先计算它们作为查询或视图的一部分。所以,不,您可能不想要total_table或者分类表中的total行;您可能确实需要一个或多个_视图_来返回相同的信息。在面对故障和并发问题时,维护聚合表是危险的。 - Clockwork-Muse
“全局值”是total_table中的数据 - 通过交叉连接,您暗示表中只会有一行(而且breakdown_table只会有一个“集合”行,而不是来自两个不同事务或其他的行)。这似乎很奇怪,并且不是数据库中通常使用表的方式(可能作为存储过程中的临时表,但即使如此...)。因此,这让我担心您正在进入X-Y问题领域 - Clockwork-Muse
3个回答

3
您可以使用交叉连接(正确地)连接表格:
SELECT 
  b.*, 
  100.0 * b.Value / t.Value as data_out
FROM breakdown as b cross join total as t;

0

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

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

0

这与其他答案非常相似,但可以以正确的格式获取百分比。

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

如果您想使用隐式连接方法,则需要在 total_table 中更改列名。
select t1.*,format(value*1.0/total,'P0') as pcnt
from breakdown_table t1,(select value as total from total_table) t2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接