0

我有一个数据集,其中包含一个 id 列表,并且这些 id 是一个类别列表(因此每个 id 可能有很多类别)。我想搜索一个类别列表,看看该类别中有多少不同的 id(计数),但是一旦一个 id 被计入一个类别,它就不会被计入另一个类别。

例子:

身份证类别
1个加油站
1个便利店
1 理发师
2 日托
2 加油站
3 便利店
3 高尔夫球场

因此,如果我正在搜索加油站和便利店的计数(按该顺序),加油站将获得 2 计数(对于 id 1&2),然后便利店将获得 1 计数(id 3)。

目前我的查询看起来像:

select category,distinct(id) from TABLE
where id in ('Gas Station','Convenience Store')
group by category 

它会给我

加油站 - 2
便利店 - 2

这不是我想要的。期望的输出:

加油站 - 2
便利店 - 1
4

2 回答 2

1

目前还不是很清楚你为什么想要这个输出,但从技术上讲,你可以通过查询来生成它

SELECT category, COUNT(DISTINCT id) count
  FROM table1
 WHERE category = 'Gas Station'
UNION ALL
SELECT category, COUNT(DISTINCT id) count
  FROM table1
 WHERE category = 'Convenience Store' 
   AND id NOT IN
       (
         SELECT DISTINCT id
           FROM table1
          WHERE category = 'Gas Station'
       );

输出:

| 类别 | 计数 |
|-------|--------|
| 加油站 | 2 |
| 便利店 | 1 |

这是SQLFiddle演示

于 2013-09-06T22:50:25.063 回答
1

更新

将其作为单个 SQL 尝试:

SELECT Category
 ,COUNT(*)
 ,@ids:=CONCAT( @ids, ID, ',' )
 FROM Table1, (SELECT @ids:=',') ids
 WHERE Category IN ('Gas Station','Convenience Store')
 AND POSITION( CONCAT( ',', ID, ',' ) IN @ids ) = 0
 GROUP BY Category

SQLfiddle 在http://sqlfiddle.com/#!2/2f026/12

更新

好的。尝试这个:

SET @ids:=',';
SELECT Category
      ,COUNT(*)
      ,@ids:=CONCAT( @ids, ID, ',' )
  FROM Table1
 WHERE Category IN ('Gas Station','Convenience Store')
   AND POSITION( CONCAT( ',', ID, ',' ) IN @ids ) = 0
 GROUP BY Category

修改 @peterm 的 sqlfiddle ( http://sqlfiddle.com/#!2/2f026/1 ) 结果是:

CATEGORY             COUNT(*)   @IDS:=CONCAT( @IDS, ID, ',' )
Convenience Store    1          ,1,3,
Gas Station          2          ,1,
于 2013-09-06T23:16:51.927 回答