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

如果列具有特定值,则对SQL中的表行进行聚合/分组,sql,xslt,sql-server-2005,Sql,Xslt,Sql Server 2005,我使用的是一个相当复杂的存储过程,它返回XML(XML用样式表转换并打印到页面;本质上是XML中的GridView)。我有一个要求,只有当一个特定列的值不是两个特定值中的一个(在这种情况下,列不会被聚合)时,才能将多行(当然,具有相同ID)聚合到一行中 实际上,我需要执行以下操作(在伪代码中): 我应该如何处理这种逻辑?我的第一个猜测是将所有的值放入一个临时表(或CTE),然后以某种方式检查所有的数据,看看是否需要提取和合并行,但对于如何实际执行,我画了一个空白,这通常是一个指标,这不是正确的方

我使用的是一个相当复杂的存储过程,它返回XML(XML用样式表转换并打印到页面;本质上是XML中的GridView)。我有一个要求,只有当一个特定列的值不是两个特定值中的一个(在这种情况下,列不会被聚合)时,才能将多行(当然,具有相同ID)聚合到一行中

实际上,我需要执行以下操作(在伪代码中):

我应该如何处理这种逻辑?我的第一个猜测是将所有的值放入一个临时表(或CTE),然后以某种方式检查所有的数据,看看是否需要提取和合并行,但对于如何实际执行,我画了一个空白,这通常是一个指标,这不是正确的方法

在XSL转换文件中这样做会更好(也许更容易)吗?我的选择仅限于三个选项:

  • 在存储过程中聚合,保持XSLT不变
  • 在XSLT中聚合,保持存储过程不变
  • 这无法通过当前返回数据的方式实现(或者如果没有大量耗时的解决方法,也无法实现)
  • 编辑

    我面临的一个问题是,记录通常具有相同的ID字段,因此合计结果不正确,因为我对整个记录求和(计算我想要的字段和我不想要的字段的合计)

    例如,记录可能类似于:

    1234    Insurance           54.65
    1234    Shipping Charge     160.00
    1234    Some Other Charge   15.00
    
    我希望最终结果是这样的:

    1234    Shipment    175.00
    1234    Insurance   54.65
    
    SELECT
      customerName,
      quoteID,
      description = CASE
        WHEN description IN ('Insurance', 'Pickup') THEN description
        ELSE 'Shipment'
      END,
      shippingCharges = SUM(shippingCharges)
    FROM quotes q
      INNER JOIN customers c ON q.customerID = c.customerID
    GROUP BY
      customerName,
      quoteID,
      CASE
        WHEN description IN ('Insurance', 'Pickup') THEN description
        ELSE 'Shipment'
      END
    
    发生的事情是这样的:

    1234    Shipment    229.65
    1234    Insurance   229.65
    
    而且它把总数都抛了出去


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

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

    select <columns>
    where description not in('Insurance','Pickup')
    group by  <some columns)
    union all
    select <columns>
    where description in('Insurance','Pickup')
    
    选择
    其中说明不在(‘保险’、‘皮卡’)中
    
    分组方式最简单的方法是编写两个查询并合并结果

    select <columns>
    where description not in('Insurance','Pickup')
    group by  <some columns)
    union all
    select <columns>
    where description in('Insurance','Pickup')
    
    选择
    其中说明不在(‘保险’、‘皮卡’)中
    
    分组方式可能是这样的:

    1234    Shipment    175.00
    1234    Insurance   54.65
    
    SELECT
      customerName,
      quoteID,
      description = CASE
        WHEN description IN ('Insurance', 'Pickup') THEN description
        ELSE 'Shipment'
      END,
      shippingCharges = SUM(shippingCharges)
    FROM quotes q
      INNER JOIN customers c ON q.customerID = c.customerID
    GROUP BY
      customerName,
      quoteID,
      CASE
        WHEN description IN ('Insurance', 'Pickup') THEN description
        ELSE 'Shipment'
      END
    
    您一定已经注意到,相同的大小写表达式在这里重复了两次。您可以使用普通的子选择来避免它:

    SELECT
      customerName,
      quoteID,
      description,
      shippingCharges = SUM(shippingCharges)
    FROM (
      SELECT
        customerName,
        quoteID,
        description = CASE
          WHEN description IN ('Insurance', 'Pickup') THEN description
          ELSE 'Shipment'
        END,
        shippingCharges = SUM(shippingCharges)
      FROM quotes q
        INNER JOIN customers c ON q.customerID = c.customerID
    ) s
    GROUP BY
      customerName,
      quoteID,
      description
    
    或CTE:

    WITH preparedList AS (
      SELECT
        customerName,
        quoteID,
        description = CASE
          WHEN description IN ('Insurance', 'Pickup') THEN description
          ELSE 'Shipment'
        END,
        shippingCharges = SUM(shippingCharges)
      FROM quotes q
        INNER JOIN customers c ON q.customerID = c.customerID
    )
    SELECT
      customerName,
      quoteID,
      description,
      shippingCharges = SUM(shippingCharges)
    FROM preparedList
    GROUP BY
      customerName,
      quoteID,
      description
    

    您可能还需要根据需要添加一些其他列。

    可能类似以下内容:

    1234    Shipment    175.00
    1234    Insurance   54.65
    
    SELECT
      customerName,
      quoteID,
      description = CASE
        WHEN description IN ('Insurance', 'Pickup') THEN description
        ELSE 'Shipment'
      END,
      shippingCharges = SUM(shippingCharges)
    FROM quotes q
      INNER JOIN customers c ON q.customerID = c.customerID
    GROUP BY
      customerName,
      quoteID,
      CASE
        WHEN description IN ('Insurance', 'Pickup') THEN description
        ELSE 'Shipment'
      END
    
    您一定已经注意到,相同的大小写表达式在这里重复了两次。您可以使用普通的子选择来避免它:

    SELECT
      customerName,
      quoteID,
      description,
      shippingCharges = SUM(shippingCharges)
    FROM (
      SELECT
        customerName,
        quoteID,
        description = CASE
          WHEN description IN ('Insurance', 'Pickup') THEN description
          ELSE 'Shipment'
        END,
        shippingCharges = SUM(shippingCharges)
      FROM quotes q
        INNER JOIN customers c ON q.customerID = c.customerID
    ) s
    GROUP BY
      customerName,
      quoteID,
      description
    
    或CTE:

    WITH preparedList AS (
      SELECT
        customerName,
        quoteID,
        description = CASE
          WHEN description IN ('Insurance', 'Pickup') THEN description
          ELSE 'Shipment'
        END,
        shippingCharges = SUM(shippingCharges)
      FROM quotes q
        INNER JOIN customers c ON q.customerID = c.customerID
    )
    SELECT
      customerName,
      quoteID,
      description,
      shippingCharges = SUM(shippingCharges)
    FROM preparedList
    GROUP BY
      customerName,
      quoteID,
      description
    

    您可能还需要根据需要添加一些其他列。

    类似于('Insurance,Pick')中的描述时按案例分组,然后customerID ELSE 1是否可以结束?您是否有一个保证唯一的列,可以在不需要任何分组的情况下使用?我认为您不应该复制数据。XSLT能够做到这一点。
    运费
    其他一些费用
    描述如何(根据什么规则)转化为
    运费
    ?这就是问题所在。要求是“除非描述是“保险”或“提货”,否则将行汇总成一行。我打算使用一个简单的案例陈述,例如,
    案例,当('Insurance'、'Pickup')中的描述出现时,然后其他“shipping”的描述以[shippmentdescription]
    结尾,但问题是要么行没有汇总成一行(它显示了““运费”和“其他一些费用”作为单独的条目)或在总额中包括“运费”,将总金额撇开。我的意思是,您似乎是根据样本输出中表示为
    1234
    (可能是
    quoteID
    ,我不确定)那么,
    'Shipping'
    是否仅仅代替了
    '1234
    'Shipping Charge'
    'Some Other Charge'
    ,还是应该取代说明(既不是
    'Insurance'
    也不是
    'pick'
    )对于除
    1234
    之外的任何其他值,在('Insurance,Pick')中进行描述时,是否可以像
    那样按情况分组然后customerID ELSE 1结束
    工作?您是否有一个保证唯一的列,可以在不需要任何分组的情况下使用?我认为您不应该复制数据。XSLT能够做到这一点。如何(根据什么规则)
    运费
    其他费用
    描述是否转化为
    运费
    ?这就是问题所在。要求是“将行汇总为一行,除非描述为“保险”或“提货”。我打算使用一个简单的案例陈述,例如('Insurance'、'Picking')中的描述时使用
    案例,然后其他“Shipping”的描述以[ShippmentDescription]
    结尾,但问题是行没有合并成一行(它将“装运费用”和“其他费用”作为单独的条目显示),或者它包括“装运费用”总而言之,抛开总量。我的意思是,您似乎是根据样本输出中表示为
    1234
    (可能是
    quoteID
    ,我不确定)的内容进行分组。那么,
    'Shipping'
    是否仅仅代替了
    '1234
    'Shipping Charge'
    'Some Other Charge'
    呢,还是应该取代
    '1234
    之外的任何其他价值的描述(既不是
    'Insurance'
    也不是
    'pick'
    )呢?我想这个小组会继续讨论