在SQL Server 2012查询中动态创建更多列

时间:2015-06-05 20:19:39

标签: sql sql-server sql-server-2012

我有一个带有[Items]的SQL表及其关联的[Cost],我希望创建一个显示成本分布的直方图。这是我用于创建垃圾箱的(工作)查询:

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,但我不确定如何处理它。

2 个答案:

答案 0 :(得分:0)

如果您对行没问题,可以这样做:

def converter():
    o_temp = float(raw_input('Enter a temperature (round to nearest integer): '))
    for i in str(o_temp):
        if i not in ['1','2','3','4','5','6','7','8','9','0','.']:
            print 'Invalid entry. Please enter only the numerical temperature measurement in integer format.'
    unit = raw_input('Convert to (F)ahrenheit or (C)elsius? ')
    if unit in ['f','F']:
        n_temp = (9.0/5.0) * float(o_temp) + 32
        print '%f C = %f F' % (o_temp, n_temp)
    elif unit in ['c','C']:
        n_temp = (5.0/9.0) * (float(o_temp) - 32)
        print '%f F = %f C' % (o_temp, n_temp)
    else: #check for valid entry
        print 'Invalid entry. Please enter F for Fahrenheit or C for    Celsius'
        unit_input()

def temp_converter():
#title, call sub-functions
    print ''
    print 'Temperature Converter'
    print ''
    converter()

print temp_converter()

如果要转置结果,则必须编写一些动态sql。类似于this

答案 1 :(得分: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