【问题标题】:How to get DISTINCT column and COUNT of column in MySQL?如何在 MySQL 中获取 DISTINCT 列和列的 COUNT?
【发布时间】:2015-07-03 07:04:08
【问题描述】:

我不知道如何为以下问题编写查询。

我正在使用以下查询

SELECT * FROM
              (
               SELECT cont_details.*, 
               location.location,
               depot_details.depot_name as depot_name, 
               depot_details.depot_code as depot_code,
               block.block_id,
               depot_details.depot_city,

               depot_tracking.depot_tracking_id as depot_tracking_id

               FROM depot_tracking

               LEFT JOIN depot_details
               ON depot_tracking.depot_details_id = depot_details.depot_details_id

               LEFT JOIN cont_details 
               ON depot_tracking.cont_details_id = cont_details.cont_details_id

               LEFT JOIN block 
               ON depot_tracking.cont_details_id = block.cont_details_id    

               LEFT JOIN cont_sold
               ON depot_tracking.cont_details_id = cont_sold.cont_details_id

               LEFT JOIN location
               ON depot_details.depot_city = location.port_code

               WHERE 
               depot_tracking.status = "0" 
               AND depot_tracking.gate_out =""
               AND block.block_id IS NULL
               AND cont_sold.cont_sold_id IS NULL

               ORDER BY
               cont_details.cont_details_id ASC,
               str_to_date(depot_tracking.gate_in,"%d-%m-%Y") DESC
              )
        origin GROUP BY origin.cont_details_id

这个查询的输出是 SHOW BELOW(只是列名会改变的例子)

 ------------------------------------------
  location   |   size   |  type |   price | 
 -------------------------------------------
   USA     |    20    |   GP   |    230   |
   USA     |    20    |   GP   |    330   | 
   UAE     |    40    |   HD   |    230   | 
   IND     |    40    |   RF   |    230   | 
   IND     |    30    |   FR   |    430   | 
   IND     |    40    |   FR   |    870   | 
   USA     |    30    |   HD   |    230   | 
   UAE     |    40    |   RF   |    430   |
   USA     |    30    |   GP   |    230   | 
   UAE     |    20    |   HD   |    445   | 
   UAE     |    20    |   RF   |    323   | 
   IND     |    30    |   FR   |    130   | 
-------------------------------------------

现在我需要从这张表中获取不同的位置并根据位置、大小和类型列进行计数。示例如下所示。

     --------------------------------------------------------------------------------
     location | 20GP | 20HD | 20RF | 30FR | 30HD | 30GP | 30GP | 40HD | 40FR | 40RF |
     --------------------------------------------------------------------------------
        UAE   |   0  |   1  |   1  |   0  |   0  |   0  |   0  |   1  |   0  |   1  |
        USA   |   2  |   0  |   0  |   0  |   1  |   0  |   1  |   0  |   0  |   0  |
        IND   |   0  |   0  |   0  |   2  |   0  |   0  |   0  |   0  |   1  |   1  |
     --------------------------------------------------------------------------------

【问题讨论】:

  • 它叫PIVOT表,用这个词你可以在这里找到类似的问题
  • @Uriil 谢谢你..你能给我一些想法或参考来做这个问题..拜托???
  • 代码here将为您生成SELECT

标签: mysql join pivot pivot-table


【解决方案1】:
SELECT 
Mtab.location,
SUM(CASE WHEN ( Mtab.size='20' AND Mtab.type='GP') THEN 1 ELSE 0 END) AS '20GP', 
SUM(CASE WHEN ( Mtab.size='20' AND Mtab.type='HS') THEN 1 ELSE 0 END) AS '20GP', 
SUM(CASE WHEN ( Mtab.size='20' AND Mtab.type='RF') THEN 1 ELSE 0 END) AS '20GP', 
(
  your current query...
  your current query...
  your current query...
)
Mtab
GROUP BY Mtab.location

【讨论】:

    【解决方案2】:

    您可以使用以下方法将数据从您的表转换为第二个表-

    SELECT location, 
    SUM(CASE WHEN size=20 AND `type`='GP' THEN COUNT(location) ELSE NULL END) AS '20GP', 
    SUM(CASE WHEN size=20 AND `type`='HD' THEN COUNT(location) ELSE NULL END) AS '20HD', 
    SUM(CASE WHEN size=20 AND `type`='RF' THEN COUNT(location) ELSE NULL END) AS '20RF' 
    FROM mytable 
    GROUP BY location, size, `type`;
    

    【讨论】:

    • 它只会返回 1 或 0 ,您需要将此列的结果相加 :)
    猜你喜欢
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2014-03-13
    • 2015-01-28
    • 2021-01-30
    相关资源
    最近更新 更多