2011-11-14 110 views
3

两列我有以下MySQL表:计数独特的行输出在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 

我要求是低于一组输出通过SQL:

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

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

我想在表上运行一个查询并生成类似上述输出的摘要。

感谢 wikki

回答

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 
+0

感谢@MizardX,它以我想要的方式工作!竖起大拇指! – Wikki

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`; 
+0

谢谢@Devart!这个伎俩gr8工作!干杯! – Wikki