2015-02-09 5 views
0

Предположим, что database.tbl содержит два поля: фрукты и цена.Как написать MySQL, чтобы получить количество различных значений в таблице?

  • Строка 1: фрукты = 'яблоко', цена = 0.60.
  • Строка 2: фрукты = 'груша', цена = 0.60.
  • Строка 3: фрукты = 'персик', цена = 0.50.

Я хочу, чтобы выполнить запрос, который возвращает количество различных значений для каждого поля, т.е. он должен возвращать

  • фрукты 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; 

но это возвращает:

  • фрукты 1
  • цена 1
+0

Это только возврат 1, потому что вы считаете имя столбца, а не данные в столбце. Должно ли это работать, не зная, для каких столбцов вам нужен счет? –

+0

Спасибо. Да, он должен работать, не зная столбцов заранее. Все, что он знает, это то, что он должен учитывать все столбцы. – oks

+0

Допустимо ли использовать хранимую процедуру для генерации результатов? –

ответ

1

Единственный способ я знаю, чтобы сделать это, чтобы взять имена столбцов из запроса INFORMATION_SCHEMA и поместите их в таблицу temp. Затем перебирайте имена столбцов в таблице temp и выполняйте динамический 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 [email protected] = 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

+0

Большое спасибо – oks

+0

http://forums.mysql.com/read.php?98,358569 также полезно – oks

Смежные вопросы