如何编写MySQL来获取表中不同值的计数?

时间:2015-02-09 20:09:11

标签: mysql

假设database.tbl包含两个字段:fruit和price。

  • 第1行:水果='苹果',价格= 0.60。
  • 第2行:水果='梨',价格= 0.60。
  • 第3行:水果='桃子',价格= 0.50。

我想运行一个查询,它返回每个字段的不同值的计数,即它应该返回

  • fruit 3
  • 价格2

因为有3种水果,但只有2种不同的价格。

我已经尝试了

SELECT C.COLUMN_NAME, COUNT(DISTINCT C.COLUMN_NAME) FROM tbl JOIN (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_SCHEMA='database' AND TABLE_NAME='tbl') AS C GROUP BY C.COLUMN_NAME;

但这会返回:

  • fruit 1
  • 价格1

1 个答案:

答案 0 :(得分:1)

我知道这样做的唯一方法是从INFORMATION_SCHEMA查询中获取列名并将它们放在临时表中。然后迭代临时表中的列名并执行动态sql以查询这些列中的不同值。这是T-SQL中的一个示例,因此您必须进行一些更改。

CREATE TABLE #values
(
    COLUMN_NAME VARCHAR(100),
    DISTINCT_COUNT INT
)

DECLARE @column AS VARCHAR(100) = ''

SELECT COLUMN_NAME INTO #columns FROM INFORMATION_SCHEMA.COLUMNS  WHERE TABLE_SCHEMA='dbo' AND TABLE_NAME='tbl'

SELECT  TOP 1@column = COLUMN_NAME
FROM    #columns
WHERE   COLUMN_NAME > @column
ORDER BY COLUMN_NAME ASC

WHILE (@@ROWCOUNT > 0)
BEGIN
    DECLARE @sql AS NVARCHAR(1000) = N'INSERT INTO #values (COLUMN_NAME, DISTINCT_COUNT) SELECT ''' + @column + ''', COUNT(DISTINCT ' + @column + N') FROM [db].[dbo].[tbl]'
    EXECUTE sp_executesql @sql

    SELECT  TOP 1 @column = COLUMN_NAME
    FROM    #columns
    WHERE   COLUMN_NAME > @column
    ORDER BY COLUMN_NAME ASC
END

SELECT * FROM #values

DROP TABLE #columns
DROP TABLE #values

这非常粗糙,只是一个如何完成它的例子。如果这是生产代码,我会确保变量类型都是一致的,并确保列名是安全的。这将有助于:How To have Dynamic SQL in MySQL Stored Procedure