计算枚举类型列上的唯一行,以在mysql中输出另外两列

时间:2011-11-14 07:55:22

标签: mysql sql count group-by

我有以下mysql表:

Item Name   Listing Fee Listing Type
watch       $0.20       LISTED
watch       $0.20       LISTED
watch       $0.30       SOLD
glasses     $0.50       LISTED
glasses     $0.50       LISTED
glasses     $0.50       LISTED
glasses     $1.00       SOLD

我需要的是由Group by SQL输出:

Item Name   Total Fee   Total Listed    Total Sold
watch       $0.70       2       1
glasses     $2.50       3       1

规则是每个“项目名称”将具有多个列表记录,其中定义了费用和列表类型。可能有两个“列表类型”[列出&已经售出。

我想在表上运行查询并生成所提及的输出摘要。

感谢 wikki

2 个答案:

答案 0 :(得分:2)

首先 - 您应该按项目对这些记录进行分组,然后计算总数,您可以使用小技巧 -

SELECT
  `Item Name`,
  SUM(`Listing Fee`) `Total Fee`,
  COUNT(IF(`Listing Type` = 'LISTED', 1, NULL)) `Total Listed`,
  COUNT(IF(`Listing Type` = 'SOLD', 1, NULL)) `Total Sold`
FROM
  mytable
GROUP BY
  `Item Name`;

答案 1 :(得分:2)

SELECT
    `Item Name`, 
    SUM(`Listing Fee`) AS `Total Fee`,
    SUM(CASE `Listing Type` WHEN 'LISTED' THEN 1 ELSE 0 END) AS `Total Listed`,
    SUM(CASE `Listing Type` WHEN 'SOLD' THEN 1 ELSE 0 END) AS `Total Sold`
FROM `Table Name`
GROUP BY `Item Name`

这将使用静态“列表类型”汇总列表。如果需要动态列表,则必须在存储过程中构建SQL并执行它。

输出:

Item Name   Total Fee   Total Listed   Total Sold
watch       $0.70       2              1
glasses     $2.50       3              1

你可以更进一步:

SELECT
    `Item Name`,
    SUM(
        CASE `Listing Type`
            WHEN 'LISTED' THEN `Listing Fee`
            ELSE 0
        END
    ) AS `Total Fee Listing`,
    SUM(
        CASE `Listing Type`
            WHEN 'SOLD' THEN `Listing Fee`
            ELSE 0
        END
    ) AS `Total Fee Sold`
FROM `Table Name`
GROUP BY `Item Name`

输出:

Item Name   Total Fee Listing   Total Fee Sold
watch       $0.40               $0.30
glasses     $1.50               $1.00