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