我有下表,我想做以下事情:
计算每个项目在表格中显示的次数
计算DISTINCT
件数
按名称对项目进行分组
+-------+---------+
| id | names |
+-------+---------+
| 1 | Apple |
| 2 | Orange |
| 3 | Grape |
| 4 | Apple |
| 5 | Apple |
| 6 | Orange |
| 7 | Apple |
| 8 | Grape |
+-------+---------+
对于1.和3.分,我有以下查询,它运作得很好:
SELECT * ,
COUNT(names) as count_name,
FROM tbl_products WHERE type = '1'
GROUP BY names
所以我得到了:
Apple (4)
Orange (2)
Grape (2)
现在我想计算按行分组的数量并添加一行来计算不同的元素,但是有一些问题,因为MySQL接受查询但不能输出结果:
SELECT * ,
COUNT(names) as count_name,
COUNT(DISTINCT names) as count_total
FROM tbl_products WHERE type = '1'
GROUP BY names
有人可以建议可能出现的问题吗?
编辑:为了获得更多许可,我想得到一张这样的表:
+-------+---------+------------+-------------+
| id | names | count_ctg | count_total |
+-------+---------+------------+-------------+
| 1 | Apple | 4 | 3 |
| 2 | Orange | 2 | 3 |
| 3 | Grape | 2 | 3 |
+-------+---------+------------+-------------+
答案 0 :(得分:1)
为什么不使用您正在使用的查询:
SELECT * ,
COUNT(names) as count_name,
FROM tbl_products WHERE type = '1'
GROUP BY names
此查询实现了所有三个目标。
1)您可以计算count_name
中每个名称值的数量。
2)由于您按names
分组,因此不同names
值的数量将等于结果集中的行数。几乎任何客户端MySQL数据库连接库都可以让您检索此值。
3)您明确使用GROUP BY names
当然,结果集中id
的值毫无意义,您可能只想选择names
和count_names
。
答案 1 :(得分:0)
1 - 。计算每个项目出现在表格中的次数:
SELECT names, count(names) FROM tbl_products WHERE type = '1' group by names
2 - 。表中存在多少个不同的项目:
SELECT DISTINCT names FROM tbl_products WHERE type = '1'
3-。按名称对项目进行分组:
SELECT count(DISTINCT names) as Total FROM tbl_products WHERE type = '1'
作为你的最后一次编辑(ALL IN ONE):
SELECT id, names, count(names), total FROM tbl_products, (select count(distinct names) as total from tbl_products) as total WHERE type = '1' group by names
答案 2 :(得分:0)
您可以在子查询中获取不同名称的计数,然后将该东西连接到您已经为1和3解决的主查询中:
SELECT names ,
COUNT(names) as count_name,
Total
FROM tbl_products
OUTER JOIN (SELECT count(DISTINCT names) as Total FROM tbl_products) t2
WHERE type = '1'
GROUP BY names
答案 3 :(得分:0)
您可以使用SQL Windowing OVER()
此查询返回row_number()函数作为结果中的id列,row_number的over(...)需要order by子句。你可以按照你想要的任何方式订购,但大部分都是按照订购的方式订购。
;WITH vwGroups (name, Quantity) AS
(
SELECT name
, COUNT(*)
FROM tbl_products
GROUP BY name
)
SELECT ROW_NUMBER() OVER(ORDER BY Quantity DESC, name) AS id
, name
, Quantity AS count_name
, COUNT(*) OVER () AS count_total
FROM vwGroups