SQL:为下一列使用大小写表达式中的值

SQL:为下一列使用大小写表达式中的值,sql,sql-server,Sql,Sql Server,试图想出一种更有效的方法来编写我的查询。我有一个很长的案例陈述,它汇总了会计GLs,我的目标是在三列中汇总 Select Month, Sum(Value1), Sum (Budget), Case When Field1 In (1001, 1002, 1003, 1004) Then 'Hardware Expense' When Field1 In (2001, 2002, 2003, 2004) Then 'Software Expense

试图想出一种更有效的方法来编写我的查询。我有一个很长的案例陈述,它汇总了会计GLs,我的目标是在三列中汇总

Select 
    Month, Sum(Value1), Sum (Budget),
    Case 
       When Field1 In (1001, 1002, 1003, 1004) Then 'Hardware Expense'
       When Field1 In (2001, 2002, 2003, 2004) Then 'Software Expense'
       When Field1 In (3001, 3002, 3003, 3004) Then 'Product Sales' 
    End As "Aggregation1",
    Case 
       When Field1 In (1001, 1002, 1003, 1004, 2001, 2002, 2003) Then 'Expenses'
       When Field1 In (3001, 3002, 3003, 3004) Then 'Sales' End As "Aggregation2"
虽然这样做有效,但我的实际陈述要长得多。理想情况下,我会将“硬件费用”和“软件费用”称为变量

When Aggregation1 In ('Hardware Expense', 'Software Expense') then 'Expenses'
最终输出为

Month, Sum(Value1), Sum (Budget), Aggregation1, Aggregation2, Aggregation3
谢谢你看! -Mark

查找表在这里可能会有所帮助,但按原样,您可以使用
交叉应用
操作符动态创建命名列,您可以在同一查询中引用这些列

请注意,稍后在查询中如何使用新定义的
Aggregation1

SELECT
    Month, Sum(Value1), Sum (Budget),
    A1.Aggregation1,
    A2.Aggregation2
FROM
    SomeTable
    CROSS APPLY
    (
        SELECT
            CASE
                WHEN Field1 In (1001, 1002, 1003, 1004) Then 'Hardware Expense'
                WHEN Field1 In (2001, 2002, 2003, 2004) Then 'Software Expense'
                WHEN Field1 In (3001, 3002, 3003, 3004) Then 'Product Sales' 
            END AS Aggregation1
    ) AS A1
    CROSS APPLY
    (
        SELECT
            CASE
                WHEN Aggregation1 In ('Hardware Expense', 'Software Expense') then 'Expenses'
                WHEN Aggregation1 In ('Product Sales') then 'Sales'
            END AS Aggregation2
    ) AS A2
;

样本数据表明,代码的第一个数字对于一个组来说是常见的。因此,类似于
CASE field1/1000,当1时,然后是“硬件费用”,当2时,然后是“软件费用”…
可以稍微缩短时间。另一个选项是另一个(或两个)表,其中包含您想要的每个代码的字符串。然后,您可以简单地在
字段1
上加入它。使用查找表,您可以拥有定义名称的范围,例如
软件费用2000 2999
费用1000 2999
同意@LaughingVergil的观点,即查找表可能是一个更优雅的解决方案。查找表也可以类似于(Field1、aggregatedType1、aggregatedType2、aggregatedType3…..1001、1、0、1)或类似的内容,以提供更大的灵活性。然后,您可以将主表与查找表连接起来,并拥有更优雅的聚合代码。聚合类型也可以是表中的字段,其中所有这些数字都是主键,而不是硬编码的查找表。