假设database.tbl包含两个字段:fruit和price。
我想运行一个查询,它返回每个字段的不同值的计数,即它应该返回
因为有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;
但这会返回:
答案 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