【问题标题】:How to conditionally exclude or add columns when calculating row total计算行总数时如何有条件地排除或添加列
【发布时间】:2016-10-02 02:39:28
【问题描述】:

我有一个存储过程,其参数定义如下

    @CategoryNames  NVARCHAR(MAX)

上述参数从应用程序中获取一个逗号分隔的字符串,例如该值可以是这样的@StaffCategoryIds=N'Category1,Category2,Category3,Category4,Category5'

然后我有下面的示例 sql 查询

SET @sql = @sql + 'TypeId, 
        TypeName, 
        Condition,
        Region, 
        (Category1 + Category2 + Category3 + Category4 + Category5) AS Total INTO ##QueryResults
FROM Table1;'

在上面的查询中计算我的 Total 列时,如何在将其包含在我的 Total 列的计算中之前检查我的 @StaffCategoryIds 逗号分隔字符串中是否存在类别列(比如 Category2 或 Category5)?

例如。如果@StaffCategoryIds 中存在“Category2”,则我将其包含在 Total 的计算中,否则我将其排除。

【问题讨论】:

  • 无特定顺序:(1)检查每一个并在每列周围使用casecase when ',' + @CategoryNames + ',' like '%,Category1%' then Category1 else 0 end + ...),(B)类似,但首先处理解析并使用标志(@987654328 @) 在查询中,(iii) 在查询之后(可能在应用程序代码中)单独对列求和并根据需要组合值,(IV) 动态 SQL 与从列表构建的查询,...。这取决于行数、运行查询的频率、group by 或其他子句...。

标签: tsql sql-server-2005


【解决方案1】:

试试:

    DECLARE @CategoryNames  NVARCHAR(MAX) = N'Category1,Category2,Category3,Category4,Category5',
        @sql NVARCHAR(MAX) = ''

SET @sql = 'SELECT TypeId, 
        TypeName, 
        Condition,
        Region, ('+ REPLACE(@CategoryNames,',','+')+')
        AS Total INTO ##QueryResults
FROM Table1;'

SELECT @SQL

返回:

SELECT TypeId, 
    TypeName, 
    Condition,
    Region, (Category1+Category2+Category3+Category4+Category5)
    AS Total INTO ##QueryResults 
FROM Table1;

那么你就可以执行那个语句了:

EXEC @Sql

【讨论】:

    【解决方案2】:

    您可以再次验证列名系统表“sys.columns”以及返回的任何行,如上所示将它们连接起来以调整您的查询

      SELECT  [name]
        FROM 
            sys.syscolumns 
        WHERE [name] IN ('Col1,Col2...ColN')
        AND OBJECT_NAME(id) = 'TableName'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2020-03-18
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多