SQLQuery - 计算单个 Table 中按第 3 个值分组的 2 个值范围内的值
SQLQuery - Counting Values For A Range Across 2 Values Grouped-By 3rd Value in A Single Table
我有一个MySQL数据库结构如下:(左边的数字是行号)
+------------+----------+--------------+-------------+
| start_dsgn | end_dsgn | min_cost_1 | min_cost_2 |
+------------+----------+--------------+-------------+
1| 1 | 2 | 3 | 100 |
2| 1 | 3 | 5 | 153 |
3| 1 | 4 | 10 | 230 |
4| 2 | 1 | 4 | 68 |
5| 2 | 3 | 5 | 134 |
6| 3 | 1 | 7 | 78 |
7| 3 | 2 | 8 | 120 |
+------------+----------+--------------+-------------+
我想查询数据库,以便对于每个开始设计,return 两个成本输入之一小于输入的结束设计的计数。因此,例如用户输入 cost_1 和 cost_2 的值。查询将 return 行数的计数,按设计分组,其中 cost_1 >= min_cost_1 或 cost_2 >= min_cost_2。
所以对于上面的数据库,让我们假设用户输入
cost_1 = 5
cost_2 = 100
这应该 return 类似于:
{1:2, 2:2, 3:1}
其中的结构是:
{start_design_1: count(row 1 + row 2), start_design_2:count(row 4 + row 5) , start_design_3:count(row 6)}
我只是想知道是否有人对如何执行此查询有任何提示或解决方案,因为我对 SQL 还比较陌生。非常感谢。
另请注意,我的数据库未按照示例中的顺序排序,我这样做是为了让示例更容易理解。
您没有指定您使用的 SQL 版本,所以我在 SQL 服务器中执行此示例,其中 @cost_1 是一个变量。您可以根据您正在使用的任何 SQL 变体的语法对其进行调整。以下将为您提供所需的计数作为 SQL 结果集:
SELECT start_dsgn, COUNT(CASE WHEN min_cost_1 <= @cost_1 OR min_cost_2 <= @cost_2 THEN end_dsng END) as Cnt
FROM table
GROUP BY start_dsgn
一旦你有了它,你就可以将它转换成你想要的任何格式,无论你使用哪种语言来查询数据库。您也没有指定您使用的是哪种语言,但看起来您想要一本字典,其中 start_dsgn 是关键。
大多数语言会 return 列表或列表、元组或字典的数组,具体取决于您使用的内容。从那里可以很容易地将它们转换成任何其他形式,至少在 Python 中是这样。像 C#、Java 和 Swift 这样的强类型语言有点棘手。
您需要使用 GROUP BY
来组合 start_dsgn
的每个值的行,因此:
select start_dsgn, count(*)
from Table1
group by start_dsgn
在 WHERE
子句中添加成本标准。如何将它们放入语句中取决于您使用的语言——您将不得不做一些研究。在 Java 中可能是:
select start_dsgn, count(*)
from Table1
where where min_cost_1 <= ? or min_cost_2 <= ?
group by start_dsgn
这将 return 它作为一个行集 - 根据您的问题,您可能必须将其转换为 JSON 结构。这不是严格意义上的 SQL 事情,因此您将不得不再次研究。
Fiddle 在这里:http://sqlfiddle.com/#!9/087c5/2
我最终解决了以下查询:
SELECT start_dsgn, count(*) FROM table_name WHERE cost_1 >= min_cost_1 OR cost_2 >= min_cost_2 GROUP BY start_dsgn;
我有一个MySQL数据库结构如下:(左边的数字是行号)
+------------+----------+--------------+-------------+
| start_dsgn | end_dsgn | min_cost_1 | min_cost_2 |
+------------+----------+--------------+-------------+
1| 1 | 2 | 3 | 100 |
2| 1 | 3 | 5 | 153 |
3| 1 | 4 | 10 | 230 |
4| 2 | 1 | 4 | 68 |
5| 2 | 3 | 5 | 134 |
6| 3 | 1 | 7 | 78 |
7| 3 | 2 | 8 | 120 |
+------------+----------+--------------+-------------+
我想查询数据库,以便对于每个开始设计,return 两个成本输入之一小于输入的结束设计的计数。因此,例如用户输入 cost_1 和 cost_2 的值。查询将 return 行数的计数,按设计分组,其中 cost_1 >= min_cost_1 或 cost_2 >= min_cost_2。
所以对于上面的数据库,让我们假设用户输入
cost_1 = 5
cost_2 = 100
这应该 return 类似于:
{1:2, 2:2, 3:1}
其中的结构是:
{start_design_1: count(row 1 + row 2), start_design_2:count(row 4 + row 5) , start_design_3:count(row 6)}
我只是想知道是否有人对如何执行此查询有任何提示或解决方案,因为我对 SQL 还比较陌生。非常感谢。
另请注意,我的数据库未按照示例中的顺序排序,我这样做是为了让示例更容易理解。
您没有指定您使用的 SQL 版本,所以我在 SQL 服务器中执行此示例,其中 @cost_1 是一个变量。您可以根据您正在使用的任何 SQL 变体的语法对其进行调整。以下将为您提供所需的计数作为 SQL 结果集:
SELECT start_dsgn, COUNT(CASE WHEN min_cost_1 <= @cost_1 OR min_cost_2 <= @cost_2 THEN end_dsng END) as Cnt
FROM table
GROUP BY start_dsgn
一旦你有了它,你就可以将它转换成你想要的任何格式,无论你使用哪种语言来查询数据库。您也没有指定您使用的是哪种语言,但看起来您想要一本字典,其中 start_dsgn 是关键。
大多数语言会 return 列表或列表、元组或字典的数组,具体取决于您使用的内容。从那里可以很容易地将它们转换成任何其他形式,至少在 Python 中是这样。像 C#、Java 和 Swift 这样的强类型语言有点棘手。
您需要使用 GROUP BY
来组合 start_dsgn
的每个值的行,因此:
select start_dsgn, count(*)
from Table1
group by start_dsgn
在 WHERE
子句中添加成本标准。如何将它们放入语句中取决于您使用的语言——您将不得不做一些研究。在 Java 中可能是:
select start_dsgn, count(*)
from Table1
where where min_cost_1 <= ? or min_cost_2 <= ?
group by start_dsgn
这将 return 它作为一个行集 - 根据您的问题,您可能必须将其转换为 JSON 结构。这不是严格意义上的 SQL 事情,因此您将不得不再次研究。
Fiddle 在这里:http://sqlfiddle.com/#!9/087c5/2
我最终解决了以下查询:
SELECT start_dsgn, count(*) FROM table_name WHERE cost_1 >= min_cost_1 OR cost_2 >= min_cost_2 GROUP BY start_dsgn;