简体   繁体   中英

MySQL which query statement should be used?

I have a dataset like this as shown below, for example row 1, 0 purchase is made for the item priced at $3, 3 purchases are made for item priced at $30. I would need to write a query to provide the summary of how many passes purchased, by categorising the prices into price range of "0-10", "11-20", "21-30", "31-40". I assume case when should be used but I am unsure of how. Please help.

+-----------------+-----------------+--------------------------+--------------------------+
| price_category1 | price_category2 | purchase_count_category1 | purchase_count_category2 |
+-----------------+-----------------+--------------------------+--------------------------+
|               3 |              30 |                        0 |                        3 |
|              20 |               6 |                        1 |                        4 |
|              25 |              11 |                        4 |                        0 |
|              17 |              12 |                        0 |                        1 |
+-----------------+-----------------+--------------------------+--------------------------+

+------+-------+-------+-------+
| 0-10 | 11-20 | 21-30 | 31-40 |
+------+-------+-------+-------+
|    4 |     2 |     7 |     0 |
+------+-------+-------+-------+

You can try below.

Working Solution

WITH MAIN
     AS (SELECT 3 AS price_category1,
                30 AS price_category2,
                0 purchase_count_category1,
                3 AS purchase_count_category2
           FROM DUAL
         UNION ALL
         SELECT 20 AS price_category1,
                6 AS price_category2,
                1 purchase_count_category1,
                4 AS purchase_count_category2
           FROM DUAL
         UNION ALL
         SELECT 25 AS price_category1,
                11 AS price_category2,
                4 purchase_count_category1,
                0 AS purchase_count_category2
           FROM DUAL
         UNION ALL
         SELECT 17 AS price_category1,
                12 AS price_category2,
                0 purchase_count_category1,
                1 AS purchase_count_category2
           FROM DUAL),
     M2
     AS (SELECT price_category1 CAT, purchase_count_category1 CNT FROM MAIN
         UNION
         SELECT price_category2, purchase_count_category2 FROM MAIN)
  SELECT CASE
            WHEN CAT >= 0 AND CAT < 11 THEN '0-10'
            WHEN CAT >= 11 AND CAT < 21 THEN '11-20'
            WHEN CAT >= 21 AND CAT < 31 THEN '21-30'
         END
            CAT,
         SUM (CNT) SUMM
    FROM M2
GROUP BY CASE
            WHEN CAT >= 0 AND CAT < 11 THEN '0-10'
            WHEN CAT >= 11 AND CAT < 21 THEN '11-20'
            WHEN CAT >= 21 AND CAT < 31 THEN '21-30'
         END
SELECT SUM(CASE WHEN price_category1 BETWEEN 0 AND 10 
                THEN purchase_count_category1 
                END) + SUM(CASE WHEN price_category2 BETWEEN 0 AND 10  
                                THEN purchase_count_category2 
                                END) AS `0-10`,
       SUM(CASE WHEN price_category1 BETWEEN 11 AND 20
                THEN purchase_count_category1 
                END) + SUM(CASE WHEN price_category2 BETWEEN 11 AND 20
                                THEN purchase_count_category2 
                                END) AS `11-20`,
       SUM(CASE WHEN price_category1 BETWEEN 21 AND 30 
                THEN purchase_count_category1 
                END) + SUM(CASE WHEN price_category2 BETWEEN 21 AND 30
                                THEN purchase_count_category2 
                                END) AS `21-30`
FROM source_table

or

SELECT SUM(CASE WHEN cat BETWEEN 0 AND 10 
                THEN cnt
                END )  AS `0-10`,
       SUM(CASE WHEN cat BETWEEN 11 AND 20
                THEN cnt
                END )  AS `11-20`,
       SUM(CASE WHEN cat BETWEEN 21 AND 30 
                THEN cnt
                END )  AS `21-30`
FROM ( SELECT price_category1 cat, purchase_count_category1 cnt
       FROM source_table
       UNION ALL
       SELECT price_category2, purchase_count_category2
       FROM source_table ) src

PS. This solution gives "horizontal" output - one row with all needed statistic. If you need "vertical" output then use the solution provided by ismetguzelgun .

Pay attention - my solution is not extendable (if you need to alter the ranges amount or borders you must alter the query text) whereas alternative solution can be extended easily after converting hardcoded ranges borders to according CTE or (the best) additional criteria table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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