Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 采用中值计算理论包括分组柱_Mysql_Group By_Median - Fatal编程技术网

Mysql 采用中值计算理论包括分组柱

Mysql 采用中值计算理论包括分组柱,mysql,group-by,median,Mysql,Group By,Median,由于,我能够计算发票表中相应供应商的中位数 这是使用的查询: SELECT AVG(middle_values) AS 'median' FROM ( SELECT t1.invoice_total AS 'middle_values' FROM ( SELECT @row:=@row+1 as `row`, iv.invoice_total FROM invoices AS iv, (SELECT @row:=0) AS r

由于,我能够计算发票表中相应供应商的中位数

这是使用的查询:

SELECT AVG(middle_values) AS 'median'
FROM (
    SELECT t1.invoice_total AS 'middle_values'
    FROM
    (
        SELECT @row:=@row+1 as `row`, iv.invoice_total
        FROM invoices AS iv, (SELECT @row:=0) AS r
        WHERE iv.vendor_id = 97
        ORDER BY iv.invoice_total
    ) AS t1,
    (
        SELECT COUNT(*) as 'count'
        FROM invoices iv
        WHERE iv.vendor_id = 97
    ) AS t2
-- the following condition will return 1 record for odd number sets, or 2 records for even number sets.
WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3;
插入语句:

INSERT INTO `invoices` VALUES (118, 97, '456792', '2011-08-03', 565.60, 0.00, 0.00, 2, '2011-09-02', NULL);
INSERT INTO `invoices` VALUES (117, 97, '456791', '2011-08-03', 4390.00, 0.00, 0.00, 2, '2011-09-02', NULL);
INSERT INTO `invoices` VALUES (116, 97, '456701', '2011-08-02', 270.50, 0.00, 0.00, 2, '2011-09-01', NULL);
INSERT INTO `invoices` VALUES (115, 97, '456789', '2011-08-01', 8344.50, 0.00, 0.00, 2, '2011-08-31', NULL);
INSERT INTO `invoices` VALUES (114, 123, '963253249', '2011-08-02', 127.75, 127.75, 0.00, 3, '2011-09-01', '2011-09-04');
INSERT INTO `invoices` VALUES (113, 37, '547480102', '2011-08-01', 224.00, 0.00, 0.00, 3, '2011-08-31', NULL);
INSERT INTO `invoices` VALUES (112, 110, '0-2436', '2011-07-31', 10976.06, 0.00, 0.00, 3, '2011-08-30', NULL);
INSERT INTO `invoices` VALUES (111, 123, '263253257', '2011-07-30', 22.57, 22.57, 0.00, 3, '2011-08-29', '2011-09-03');
做以下事情没有好处:

SELECT t1.vendor_id, AVG(middle_values) AS 'median'
FROM (
    SELECT vendor_id, t1.invoice_total AS 'middle_values'
    FROM
    (
        SELECT @row:=@row+1 as `row`, iv.invoice_total
        FROM invoices AS iv, (SELECT @row:=0) AS r
        WHERE iv.vendor_id = 97
        ORDER BY iv.invoice_total
    ) AS t1,
    (
        SELECT COUNT(*) as 'count'
        FROM invoices iv
        WHERE iv.vendor_id = 97
    ) AS t2, invoices
-- the following condition will return 1 record for odd number sets, or 2 records for even number sets.
WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3;

要在父查询中使用vendor_id,需要返回它,请在每个嵌套子查询中选择它:

SELECT t3.vendor_id, AVG(middle_values) AS 'median'
FROM (
    SELECT t1.invoice_total AS 'middle_values', t1.vendor_id
    FROM
    (
        SELECT @row:=@row+1 as `row`, iv.invoice_total, iv.vendor_id
        FROM invoices AS iv, (SELECT @row:=0) AS r
        WHERE iv.vendor_id = 97
        ORDER BY iv.invoice_total
    ) AS t1,
    (
        SELECT COUNT(*) as 'count'
        FROM invoices iv
        WHERE iv.vendor_id = 97
    ) AS t2
-- the following condition will return 1 record for odd number sets, or 2 records for even number sets.
WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3
SELECT t3.vendor_id, AVG(middle_values) AS 'median'
FROM (
    SELECT t1.invoice_total AS 'middle_values', t1.vendor_id
    FROM
    (
        SELECT @row:=@row+1 as `row`, iv.invoice_total, iv.vendor_id
        FROM invoices AS iv, (SELECT @row:=0) AS r
        WHERE iv.vendor_id = 97
        ORDER BY iv.invoice_total
    ) AS t1,
    (
        SELECT COUNT(*) as 'count'
        FROM invoices iv
        WHERE iv.vendor_id = 97
    ) AS t2
-- the following condition will return 1 record for odd number sets, or 2 records for even number sets.
WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3