2015-06-05 3 views
0

У меня есть таблица SQL с [Items] и связанные с ними [Cost], и я ищу, чтобы создать гистограмму, показывающую распределение затрат. Это мой (рабочий) запрос используется для создания бункеров:Динамически создавать больше столбцов в запросе SQL Server 2012

SELECT 
    [$0-$25]=COUNT(CASE WHEN [Cost]>=0 AND [Cost]<25 THEN 1 END), 
    [$25-$50]=COUNT(CASE WHEN [Cost]>=25 AND [Cost]<50 THEN 1 END) 
    --etc. 
FROM 
    table_name 

диапазон стоимость может отличаться друг от друга для различных элементов в таблице - другими словами, высокая стоимость не может быть жестко закодированы. Каков наилучший способ начать с $0 и создать дополнительные столбцы $25 по мере необходимости? Я думаю, что решение включает в себя использование MAX([Cost]) и PIVOT вместе, но я не уверен, как это сделать.

+0

Если вы только получаете эти данные из таблицы, возможно, лучше получить данные в строках вместо столбцов. Вы можете использовать этот запрос: выберите счет (стоимость/25) в качестве номера, (стоимость/25) * 25 как стоимость из таблицы по стоимости/25 на 2 – Luc

ответ

0

Если все в порядке со строками, вы можете сделать это:

SELECT CAST(CAST([Cost] AS INT)/25 * 25 AS VARCHAR) + '-' + 
     CAST(CAST([Cost] AS INT)/25 * 25 + 25 AS VARCHAR) AS Range, count(*) As cnt 
FROM Table_Name 
group by CAST(CAST([Cost] AS INT)/25 * 25 AS VARCHAR) + '-' + 
     CAST(CAST([Cost] AS INT)/25 * 25 + 25 AS VARCHAR) 

Если вы хотите перенести результаты, вы должны будете написать некоторый динамический SQL. что-то вроде this.

0

Я предлагаю вам создать хранимую процедуру так:

CREATE PROCEDURE [dbo].[SP_Test] 
    @MaxValue decimal(5,2), 
    @StepValue decimal(2,2) 
AS 
BEGIN 

DECLARE @SQL nvarchar(max) = ''; 
DECLARE @ItemsNo decimal(2,2) = @MaxValue/@StepValue; 

;WITH CTE(s) AS (
    SELECT 0 
    UNION ALL 
    SELECT s + 1 
    FROM CTE 
    WHERE s < @ItemsNo - 1) 
SELECT @SQL = @SQL + CASE WHEN @SQL = '' THEN '' ELSE ',' END 
        + '[$' + CAST((s * @StepValue) AS nvarchar(5)) 
        + '-$' + CAST(((s + 1) * @StepValue) AS nvarchar(5)) 
        + ']=COUNT(CASE WHEN [Cost]>=' + CAST((s * @StepValue) AS nvarchar(5)) 
        + ' AND [Cost]<' + CAST(((s + 1) * @StepValue) AS nvarchar(5)) 
        + ' THEN 1 END)' 
FROM CTE 

SET @SQL = 'SELECT ' + @SQL + ' FROM table_name' 
EXEC(@SQL) 

END 

Теперь вы можете запустить хранимую процедуру так:

EXEC [dbo].[SP_Test] 
    @MaxValue = 100.0, 
    @StepValue = 25.0 
Смежные вопросы