2016-05-13 5 views
0

Я пытаюсь получить значение MAX из моего столбца, созданного в процентах, и получит из столбца nvarchar информацию из разных вещей.Запрос на поиск значения MAX

Это запрос:

SELECT Filetype AS 'Extensão', 
COUNT(*) AS 'Nº de ficheiros', 
CAST(((COUNT(Filetype) * 100.0)/(SELECT COUNT(*) FROM infofile)) AS DECIMAL(10,2)) AS 'Percentagem (%)', 
SUM(Filesize) AS 'Total(KB)', 
NULL AS 'Convertido para MB' 
FROM infofile 
GROUP BY Filetype 
UNION ALL 
SELECT '---------------', 
COUNT('Nº de extensões'), 
((COUNT(Filetype) * 100)/(SELECT COUNT(Filetype) FROM infofile)), 
SUM(Filesize), 
SUM(Filesize)/1024 
FROM infofile 

То, что я пытаюсь сделать запрос, который дает мне процент MAX и MIN от этой колонки. Я пытался использовать

SELECT MAX('Percentagem (%)') * 100 
FROM infofile 

но это будет дает мне ошибку:

Conversion failed when converting the varchar value 'Percentagem (%)' to data type int.

Кстати это локальная база данных, которая используется на SqlServer

+0

Почему вы бросили в десятичную? Не является ли результат вашего расчета уже десятичным? –

+0

Если вам нужна дополнительная помощь, то покажите полный запрос и пометьте свои СУБД. –

+0

Это тот запрос, который я хочу. Я хочу получить это –

ответ

1
SELECT --MAX('Percentagem (%)') 'Percentagem (%)' will be treated as a string. use [] to enclose the calculated column name 
MAX([Percentagem (%)]),MIN([Percentagem (%)]) 
FROM infofile 
0

ваш запрос fail, потому что «Percentagem (%)» - это строка, начинающаяся с «P», за которой следует «e» и т. д.

Для псевдонимов столбцов используйте стандартный разделитель SQL ": MAX("Percentagem (%)"). Если вы используете SQL Server, используйте нестандартные разделители [ и ] вместо: MAX([Percentagem (%)]).

И наилучшим решением было бы, конечно, не использовать имена столбцов или псевдонимов, которые должны быть экранированы в первую очередь, например. MAX(percentagem).

+0

Я использую интерфейс Visual Studio 2015 ....Я хочу сделать этот запрос разделенным, но я не могу это сделать, потому что «Percentagem (%)» не является реальным столбцом, который вы знаете? –

+0

Ну, нет, не совсем. Как уже упоминалось в основных комментариях: отредактируйте свой questsion и покажите полный SQL. (Вы указали только одну строку, начинающуюся с 'CAST', но вы должны показать полный запрос, включая' FROM' и 'WHERE'). Мой второй запрос заключался в том, что вы помечаете СУБД, которую используете, чего вы еще не сделали. Вы работаете в MySQL или SQL Server, на PostgreSQL или Oracle, или что еще? –

+0

Извините. Я только что отредактировал его. –

0

При условии, ваша версия SQL Server не слишком стар, вы можете использовать окно функции:

select 
    filetype as [Extensão], 
    count(*) as [Nº de ficheiros], 
    count(*) * 100.0/sum(count(*)) over() as [Percentagem (%)], 
    sum(filesize) as [Total(KB)], 
    sum(filesize)/1024.0 as [Convertido para MB], 
    min(count(*)) over() * 100.0/sum(count(*)) over() as [Min. Percentagem (%)], 
    max(count(*)) over() * 100.0/sum(count(*)) over() as [Max. Percentagem (%)] 
from infofile 
group by filetype 
order by filetype; 

SQL скрипку: http://sqlfiddle.com/#!6/3e0792/1

В линии итоговой, она должна быть обеспечена возможность генерации, которые элегантно с ROLLUP или GROUP BY GROUPING SETS, но я не уверен, как они сочетаются с функциями окна. Поэтому я не могу дать хороший совет здесь.

Иногда проще всего получить итоговую строку за пределами SQL в приложении, используя язык программирования.

Вот полный рабочий запрос:

select 
    [Extensão], 
    sum([Nº de ficheiros]) as [Nº de ficheiros], 
    round(sum([Percentagem (%)]), 2) as [Percentagem (%)], 
    sum([Total(KB)]) as [Total(KB)], 
    round(sum([Convertido para MB]),2) as [Convertido para MB], 
    round(min([Min. Percentagem (%)]), 2) as [Min. Percentagem (%)], 
    round(max([Max. Percentagem (%)]), 2) as [Max. Percentagem (%)] 
from 
(
    select 
    filetype as [Extensão], 
    count(*) as [Nº de ficheiros], 
    count(*) * 100.0/sum(count(*)) over() as [Percentagem (%)], 
    sum(filesize) as [Total(KB)], 
    sum(filesize)/1024.0 as [Convertido para MB], 
    min(count(*)) over() * 100.0/sum(count(*)) over() as [Min. Percentagem (%)], 
    max(count(*)) over() * 100.0/sum(count(*)) over() as [Max. Percentagem (%)] 
    from infofile 
    group by filetype 
) per_filetype 
group by rollup([Extensão]) 
order by case when [Extensão] is null then 2 else 1 end, [Extensão]; 

SQL скрипку: http://sqlfiddle.com/#!6/3e0792/29

+0

Проблема в том, что он заполняет все строки, и я предпочел бы, если бы этот фрагмент запроса не мог быть после UNION ALL –

+0

Я не понимаю, что вы говорите, извините. Я добавил полный запрос. Главное преимущество над UNION ALL состоит в том, что таблица должна быть прочитана только один раз. –

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