SQLQuery - 计算2个值范围内的值 - 单个表中的第3个值组

时间:2015-04-23 01:55:28

标签: mysql sql count group-by

我的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 |
+------------+----------+--------------+-------------+

我想查询数据库,以便对于每个开始设计,返回两个成本输入中的一个小于输入的最终设计的计数。例如,用户输入cost_1和cost_2的值。该查询将返回按设计分组的行数,其中cost_1> = min_cost_1 OR cost_2> = min_cost_2。

因此,对于上面的数据库,我们假设用户输入

cost_1 = 5
cost_2 = 100

这应该返回类似:

{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相对较新。非常感谢你。

另请注意,我的数据库未按示例进行排序,我这样做是为了让示例更容易理解。

3 个答案:

答案 0 :(得分:1)

您没有指定您正在使用的SQL版本,所以我在SQL Server中执行此示例,其中@ 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为关键字的字典。

大多数语言都会返回列表或列表,列表,元组或字典,具体取决于您使用的内容。从那里起,很容易将它们转换成任何其他形式,至少在Python中。像C#,Java和Swift这样的强类型语言有点棘手。

答案 1 :(得分:1)

您需要使用start_dsgn来合并select start_dsgn, count(*) from Table1 group by start_dsgn 的每个值的行:

WHERE

select start_dsgn, count(*) from Table1 where where min_cost_1 <= ? or min_cost_2 <= ? group by start_dsgn 子句中添加成本标准。如何让他们进入声明取决于您使用的语言 - 您将不得不做一些研究。在Java中它可能是:

SELECT f.factura
     , f.fila
     , f.cantidad
     , r.cantidad
     , v.cantidad
     , f.estado
FROM   articulos_factura_venta f
-- JOIN   articulos a ON a.codigo = f.articulo  -- just noise
-- JOIN   tallas    t ON t.codigo = f.talla
-- JOIN   colores   c ON c.codigo = f.color
JOIN   empleados e ON e.codigo = f.vendedor
LEFT   JOIN articulos_factura_venta r ON r.fila = f.fila
                                     AND r.color = f.color
                                     AND r.talla = f.talla
                                     AND r.origen = f.origen
                                     AND r.factura = f.factura
                                     AND r.articulo = f.articulo
                                     AND r.vendedor = f.vendedor
                                     AND r.estado & 16 <> 0
LEFT   JOIN articulos_factura_venta v ON v.fila = f.fila
                                     AND v.color = f.color
                                     AND v.talla = f.talla
                                     AND v.origen = f.origen
                                     AND v.factura = f.factura
                                     AND v.articulo = f.articulo
                                     AND v.vendedor = f.vendedor
                                     AND v.estado & 8 <> 0
WHERE  f.factura = 28239
AND    f.estado & 4 <> 0
ORDER  BY f.estado;

这会将其作为行集返回 - 您可能需要将其转换为JSON结构。这不是严格意义上的SQL事情,所以你必须再次研究。

小提琴在这里:http://sqlfiddle.com/#!9/087c5/2

答案 2 :(得分:0)

我最终解决了以下问题:

SELECT start_dsgn, count(*) FROM table_name WHERE cost_1 >= min_cost_1 OR cost_2 >= min_cost_2 GROUP BY start_dsgn;