简体   繁体   English

如何在mysql UNION查询中编写此GROUP BY

[英]How do I write this GROUP BY in mysql UNION query

Trying to group the results of two queries together. 尝试将两个查询的结果组合在一起。 When I run this query: 当我运行此查询时:

SELECT pr_id,
        pr_sbtcode,
        pr_sdesc,
        od_quantity,
        od_amount
FROM (
        SELECT `bgProducts`.`pr_id`,
                `bgProducts`.`pr_sbtcode`,
                `bgProducts`.`pr_sdesc`,
                SUM(`od_quantity`) AS `od_quantity`,
                SUM(`od_amount`) AS `od_amount`,
                MIN(UNIX_TIMESTAMP(`or_date`)) AS `or_date`
        FROM `bgOrderMain`
        INNER JOIN `bgOrderData`
        INNER JOIN `bgProducts`
        WHERE `bgOrderMain`.`or_id` = `bgOrderData`.`or_id`
                AND `od_pr` = `pr_id`
                AND UNIX_TIMESTAMP(`or_date`) >= '1262322000'
                AND UNIX_TIMESTAMP(`or_date`) <= '1346990399'
                AND (
                        `pr_id` = '415'
                        OR `pr_id` = '1088'
                        )
        GROUP BY `bgProducts`.`pr_id`

        UNION

        SELECT `bgProducts`.`pr_id`,
                `bgProducts`.`pr_sbtcode`,
                `bgProducts`.`pr_sdesc`,
                SUM(`od_quantity`) AS `od_quantity`,
                SUM(`od_amount`) AS `od_amount`,
                MIN(UNIX_TIMESTAMP(`or_date`)) AS `or_date`
        FROM `npOrderMain`
        INNER JOIN `npOrderData`
        INNER JOIN `bgProducts`
        WHERE `npOrderMain`.`or_id` = `npOrderData`.`or_id`
                AND `od_pr` = `pr_id`
                AND UNIX_TIMESTAMP(`or_date`) >= '1262322000'
                AND UNIX_TIMESTAMP(`or_date`) <= '1346990399'
                AND (
                        `pr_id` = '415'
                        OR `pr_id` = '1088'
                        )
        GROUP BY `bgProducts`.`pr_id`
        ) TEMPTABLE3;

it produces this result 它产生了这个结果

+--------+--------------+----------------+---------------+------------+
| pr_id  |  pr_sbtcode  |  pr_sdesc      |  od_quantity  |  od_amount |
+--------+--------------+----------------+---------------+------------+
|   415  |  NP13        |  Product 13    |  5            |  125       |
|  1088  |  NPAW        |  Product AW    |  4            |  100       |
|   415  |  NP13        |  Product 13    |  5            |  125       |
|  1088  |  NPAW        |  Product AW    |  2            |  50        |
+--------+--------------+----------------+---------------+------------+ 

What I want to get a result that combines those into 2 lines: 我希望得到的结果将这些结合成两行:

+--------+--------------+----------------+---------------+------------+ 
| pr_id  |  pr_sbtcode  |  pr_sdesc      |  od_quantity  |  od_amount |
+--------+--------------+----------------+---------------+------------+ 
|   415  |  NP13        |  Product 13    |  10           |  250       |
|  1088  |  NPAW        |  Product AW    |  6            |  150       | 
+--------+--------------+----------------+---------------+------------+

So I added GROUP BY pr_id to the end of the query: 所以我在查询结尾处添加了GROUP BY pr_id:

SELECT pr_id,
        pr_sbtcode,
        pr_sdesc,
        od_quantity,
        od_amount
FROM (
        SELECT `bgProducts`.`pr_id`,
                `bgProducts`.`pr_sbtcode`,
                `bgProducts`.`pr_sdesc`,
                SUM(`od_quantity`) AS `od_quantity`,
                SUM(`od_amount`) AS `od_amount`,
                MIN(UNIX_TIMESTAMP(`or_date`)) AS `or_date`
        FROM `bgOrderMain`
        INNER JOIN `bgOrderData`
        INNER JOIN `bgProducts`
        WHERE `bgOrderMain`.`or_id` = `bgOrderData`.`or_id`
                AND `od_pr` = `pr_id`
                AND UNIX_TIMESTAMP(`or_date`) >= '1262322000'
                AND UNIX_TIMESTAMP(`or_date`) <= '1346990399'
                AND (
                        `pr_id` = '415'
                        OR `pr_id` = '1088'
                        )
        GROUP BY `bgProducts`.`pr_id`

        UNION

        SELECT `bgProducts`.`pr_id`,
                `bgProducts`.`pr_sbtcode`,
                `bgProducts`.`pr_sdesc`,
                SUM(`od_quantity`) AS `od_quantity`,
                SUM(`od_amount`) AS `od_amount`,
                MIN(UNIX_TIMESTAMP(`or_date`)) AS `or_date`
        FROM `npOrderMain`
        INNER JOIN `npOrderData`
        INNER JOIN `bgProducts`
        WHERE `npOrderMain`.`or_id` = `npOrderData`.`or_id`
                AND `od_pr` = `pr_id`
                AND UNIX_TIMESTAMP(`or_date`) >= '1262322000'
                AND UNIX_TIMESTAMP(`or_date`) <= '1346990399'
                AND (
                        `pr_id` = '415'
                        OR `pr_id` = '1088'
                        )
        GROUP BY `bgProducts`.`pr_id`
        ) TEMPTABLE3
GROUP BY pr_id;

But that just gives me this: 但这只是给了我这个:

+--------+--------------+----------------+---------------+------------+ 
| pr_id  |  pr_sbtcode  |  pr_sdesc      |  od_quantity  |  od_amount |
+--------+--------------+----------------+---------------+------------+ 
|   415  |  NP13        |  Product 13    |  5            |  125       | 
|  1088  |  NPAW        |  Product AW    |  4            |  100       |
+--------+--------------+----------------+---------------+------------+

What am I missing here?? 我在这里失踪了什么?

your code is hard to format since you have added nbsp . 您的代码很难格式化,因为您已经添加了nbsp but any way try this one, 但无论如何尝试这个,

first attemp 第一次尝试

SELECT pr_id,
        pr_sbtcode,
        pr_sdesc,
        SUM(od_quantity) totalQuantity,
        SUM(od_amount) totalAmount
FROM 
    (
        SELECT `bgProducts`.`pr_id`,
                `bgProducts`.`pr_sbtcode`,
                `bgProducts`.`pr_sdesc`,
                SUM(`od_quantity`) AS `od_quantity`,
                SUM(`od_amount`) AS `od_amount`,
                MIN(UNIX_TIMESTAMP(`or_date`)) AS `or_date`
        FROM `bgOrderMain`
        INNER JOIN `bgOrderData`
        INNER JOIN `bgProducts`
        WHERE `bgOrderMain`.`or_id` = `bgOrderData`.`or_id`
                AND `od_pr` = `pr_id`
                AND UNIX_TIMESTAMP(`or_date`) >= '1262322000'
                AND UNIX_TIMESTAMP(`or_date`) <= '1346990399'
                AND (
                        `pr_id` = '415'
                        OR `pr_id` = '1088'
                    )
        GROUP BY `bgProducts`.`pr_id`
        UNION
        SELECT `bgProducts`.`pr_id`,
                `bgProducts`.`pr_sbtcode`,
                `bgProducts`.`pr_sdesc`,
                SUM(`od_quantity`) AS `od_quantity`,
                SUM(`od_amount`) AS `od_amount`,
                MIN(UNIX_TIMESTAMP(`or_date`)) AS `or_date`
        FROM `npOrderMain`
        INNER JOIN `npOrderData`
        INNER JOIN `bgProducts`
        WHERE `npOrderMain`.`or_id` = `npOrderData`.`or_id`
                AND `od_pr` = `pr_id`
                AND UNIX_TIMESTAMP(`or_date`) >= '1262322000'
                AND UNIX_TIMESTAMP(`or_date`) <= '1346990399'
                AND (
                        `pr_id` = '415'
                        OR `pr_id` = '1088'
                    )
        GROUP BY `bgProducts`.`pr_id`
    ) unionedTable
GROUP BY pr_id,
        pr_sbtcode,
        pr_sdesc

SQLFiddle Demo SQLFiddle演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM