如果列具有特定值,则在SQL中聚合/分组表行

Way*_*ina 1 sql xslt sql-server-2005

我正在使用一个相当毛茸茸的Stored Proc来返回XML(XML用样式表转换并打印到页面;本质上是XML格式的GridView).我有聚集多个行(具有相同的ID,当然)的要求成单个行仅当一特定列的值不是两个特定值(在这种情况下,列不聚集的)中的一个.

实际上我需要做以下(在伪代码中):

select quoteID, customerName, shippingCharges, description, /*other columns*/
from quotes q
    inner join customers c on q.customerID = c.customerID
where shipDate between @fromDate and @toDate
for xml explicit

if description != "Insurance" and description != "Pickup":
    /*aggregate the rows for that quoteID into one single row
      adding together charges and the like as needed*/  
else:
    /*nothing - okay to have multiple rows*/
Run Code Online (Sandbox Code Playgroud)

我该如何处理这种逻辑呢?我的第一个猜测是将所有值放入临时表(或CTE),然后以某种方式检查所有数据以查看是否需要提取和组合行,但我正在绘制一个空白,以确定如何实际完成,这通常是一个指标,这不是正确的做法...

相反,这会在XSL转换文件中做得更好(也许更容易吗?)吗?我的选择仅限于三种选择:

  1. 在存储过程中聚合,保持XSLT不变
  2. 在XSLT中聚合,保持存储过程不变
  3. 使用当前返回数据的方式无法实现这一点(或者在没有大量耗时的解决方法的情况下无法实现)

编辑

一个我所面临的问题是,记录通常具有相同的ID字段,因此总计是走出来不正确,因为我总结整个记录(其计算总的我想外地外地,我不想要).

例如,记录可能是这样的:

1234    Insurance           54.65
1234    Shipping Charge     160.00
1234    Some Other Charge   15.00
Run Code Online (Sandbox Code Playgroud)

我希望完成的结果是这样的:

1234    Shipment    175.00
1234    Insurance   54.65
Run Code Online (Sandbox Code Playgroud)

发生了什么事:

1234    Shipment    229.65
1234    Insurance   229.65
Run Code Online (Sandbox Code Playgroud)

它正在抛弃总数.

我使用的策略是创建一个名为"AggregateData"的CTE,它按ID和描述汇总各种金额和组; 这是失败的,因为它给出了上述结果(每个描述的总和,因此值出现两次并在报告上添加两次).我得到的最接近的是不按描述对其进行分组,而是将其包装在Max函数中(是的,我知道这不是一个好主意).这给了我正确的总数,但描述没有准确反映,例如一些记录应该是"保险",而是显示"发货".

SQL*_*ace 5

最简单的方法是编写两个查询并将结果联合起来

select <columns>
where description not in('Insurance','Pickup')
group by  <some columns)
union all
select <columns>
where description in('Insurance','Pickup')
Run Code Online (Sandbox Code Playgroud)