我有一张像这样的表hw1:
+--------+--------+----------+
| budget | price | count(*) |
+--------+--------+----------+
| high | high | 9 |
| high | low | 13 |
| high | medium | 20 |
| low | high | 60 |
| low | low | 94 |
| low | medium | 162 |
| medium | high | 151 |
| medium | low | 228 |
| medium | medium | 355 |
+--------+--------+----------+
我想在右侧添加另一列,看起来像"count(*)/budget
样本大小“
例如,对于第一行where budget = high and price = high
,
我们会得到一个数字calculated by 9/42
(42是高预算样本量= [9 + 13 + 20])
我尝试过以下代码但结果为null
select (select count(*) from hw1 where count(*) like 'a%') /
(select count(*) from hw1 where budget like 'b%') from hw1;
我相信这并不难,但我无法得到结果..有人可以帮助我吗?我对mysql不是很有经验..
先谢谢。
答案 0 :(得分:1)
您可以使用其他查询来获取budget
的每个值的“预算样本大小”,然后将该查询的结果用作行来源。
(如果没有表格和示例数据的定义,我们只是猜测您将使用的查询。)
SELECT r.budget
, COUNT(*) AS budget_sample_size
FROM hw1 r
GROUP BY r.budget
我们希望查询返回每个budget
值一行的结果,例如
budget budget_sample_size
------ ------------------
high 42
low 316
medium 734
现在的诀窍是将该查询用作另一个查询中的行源。我们将这个查询包装在parens中,并在另一个查询的FROM子句中引用它,就像它是一个表一样。举个简单的例子......
SELECT s.budget
, s.budget_sample_size
FROM (
SELECT r.budget
, COUNT(*) AS budget_sample_size
FROM hw1 r
GROUP BY r.budget
) s
通过使用这样的查询,作为行源,我们可以使查询返回的值在外部查询中可用。用作这种行源的查询称为“内联视图”。在MySQL版本中,它被称为“派生表”。
作为该查询的示例:
SELECT t.budget
, t.price
, COUNT(*)
, s.budget_sample_size
, COUNT(*)/s.budget_sample_size
FROM hw1 t
JOIN (
SELECT r.budget
, COUNT(*) AS budget_sample_size
FROM hw1 r
GROUP BY r.budget
) s
ON s.budget = t.budget
GROUP
BY t.budget
, t.price
注意:此示例查询依赖于针对GROUP BY
行为的特定于MySQL的扩展。其他数据库会抛出错误(“SELECT列表中的非聚合不在GROUP BY中”)。它只需要对查询进行一些小调整即可使其在其他数据库中工作...例如添加MAX()聚合函数...将s.budget_sample_size
表达式替换为MAX(s.budget_sample_size)
。
答案 1 :(得分:0)
请更改字段的名称' count(*)'
并且可能澄清你的问题
然而
SELECT
(SELECT [count(*)] FROM hw1 WHERE budget like 'high' AND price like 'high') /
(SELECT SUM([count(*)]) FROM hw1 WHERE budget like 'high')
答案 2 :(得分:0)
既然您既没有提供原始表结构也没有提供原始数据源,也没有提供您的查询 - 这是我的猜测方法:
SELECT hw1.*,
count(*) count_price,
(count(*)/b.budget_all) price_share
FROM hw1
LEFT JOIN (
SELECT budget, COUNT(*) budget_all
FROM hw1
GROUP BY budget
) b
ON b.budget = hw1.budget
答案 3 :(得分:0)
嗨,如果我理解你的答案,我认为你可以做这样的事情
SELECT t1.buget, t1.price, t1.cnt, t1.cnt / t2.sumCnt
FROM myTable AS t1
INNER JOIN (SELECT buget, SUM(cnt) AS sumCnt
FROM myTable
GROUP BY buget) AS t2
ON t1.buget = t2.buget;
它的简单内连接语句和子查询将返回像这样的结果
buget | sumCtn
--------------
high | 42
--------------
low | 316
--------------
等...
你可以在选择语句中使用简单的垫子来加入你的桌子......
另请注意,我更改了列的一个小名称,因此不要对此感到困惑。
GL!
P.S。这是SQL FIDDLE,看看它是如何运作的......