2010-08-16 41 views
1

的mysql>select * from products;GROUP BY显示了所有不同的列

+---------+-------------+-----------+------+ 
| prod_id | prod_source | prod_type | flag | 
+---------+-------------+-----------+------+ 
|  1 | USA   |   2 | 0 | 
|  2 | USA   |   2 | 0 | 
|  3 | USA   |   2 | 0 | 
|  4 | USA   |   3 | 1 | 
|  5 | USA   |   3 | 0 | 
|  6 | BRA   |   1 | 1 | 
|  7 | BRA   |   2 | 1 | 
+---------+-------------+-----------+------+ 

所需resulset:

+-----------+----------+ 
| prod_type | count(*) | 
+-----------+----------+ 
|   2 |  3 | 
|   3 |  0 | 
|   4 |  0 | 
+-----------+----------+ 


where condition 
prod_source = USA 
flag=0 

但我得到的结果集是

+-----------+----------+ 
| prod_type | count(*) | 
+-----------+----------+ 
|   2 |  3 | 
+-----------+----------+ 

与查询

SELECT prod_type ,count(*) 
    FROM products 
    WHERE prod_source='USA' and flag=0 
    GROUP by prod_type 
    ORDER by prod_type; 

如何获得所有prod_type在美国的计数resulset?即使计数为0,它也必须在美国显示所有prod_type。

表定义:

CREATE TABLE `products` (
    `prod_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    `prod_source` VARCHAR(45) NOT NULL, 
    `prod_type` INTEGER UNSIGNED NOT NULL, 
    `flag` INTEGER UNSIGNED NOT NULL, 
    PRIMARY KEY (`prod_id`) 
) 
ENGINE = InnoDB; 

数据插入:

INSERT INTO `products` 
VALUES (1,'USA',2,0), 
     (2,'USA',2,0), 
     (3,'USA',2,0), 
     (4,'USA',3,1), 
     (5,'USA',4,1), 
     (6,'BRA',1,1), 
     (7,'BRA',2,1); 

回答

0

检查您的数据,查询是正确的,但你在顶级表数据不匹配插入脚本( prod_id 5插入flag = 1)

要获得0,您需要选择不同的prod_type,然后将它加入到当前查询中。

2

在SQL Server中,我会使用以下命令:

SELECT prod_type,SUM(CASE WHEN flag=0 THEN 1 ELSE 0 END) 
FROM products 
    WHERE prod_source='USA' 
    GROUP by prod_type 
    ORDER by prod_type 

我不能说是否相同将在MySQL工作。

(Cheeky在SELECT子句中编辑更正列名)

+0

它在mysql中也工作正常。在select查询中,使用prod_type而不是prod_id。像这样使用 SELECT prod_type,SUM(CASE WHEN flag = 0 THEN 1 ELSE 0 END) FROM products WHERE prod_source ='USA' GROUP by prod_type ORDER by prod_type – Karthik 2010-08-16 07:25:36