我的聚合不受ROLLUP的影响

时间:2011-05-23 15:25:13

标签: sql sql-server tsql

我的查询类似于以下内容:

SELECT  CASE WHEN (GROUPING(Name) = 1) THEN 'All' ELSE Name END AS Name, 
        CASE WHEN (GROUPING(Type) = 1) THEN 'All' ELSE Type END AS Type,
        sum(quantity) AS [Quantity],
        CAST(sum(quantity) * (SELECT QuantityMultiplier FROM QuantityMultipliers WHERE a = t.b) AS DECIMAL(18,2)) AS Multiplied Quantity
FROM @Table t
GROUP BY Name, Type WITH ROLLUP

我正在尝试返回名称,类型,总计数量和总计数量乘以任意数字的列表。到目前为止都很好。我还需要为每个Name和每个Type返回一个小计的总行,例如以下

Name        Type        Quantity        Multiplied Quantity
-------     ---------   -----------     -------------------
a           1           2               4
a           2           3               3
a           ALL         5               7
b           1           6               12
b           2           1               1
b           ALL         7               13
ALL         ALL         24              40

前3列很好。虽然我在累加行中获得了乘以数量的空值。我认为这种情况发生的唯一原因是因为SQL不能将最后一列识别为聚合,因为我将它乘以某种东西。

我可以以某种方式解决这个问题而不会让事情变得太复杂吗?

如果无法做到这一点,我会回到临时桌上。

1 个答案:

答案 0 :(得分:1)

在获取乘数的子查询中,您有WHERE a=b。主查询中的表格中是a还是b

如果这些值是静态的(与主查询无关),它看起来应该没问题......

如果ab值为nametype字段,则汇总记录可以为NULL。如果是这样,您可以更改为类似于...的内容。

CAST(sum(quantity * (<multiplie_query>)) AS DECIMAL(18,2))


如果ab是您的主要查询中的其他字段,那么您将获得多条记录,而不仅仅是一个乘数。你可以改成像......

CAST(sum(quantity) * (SELECT MAX(multiplier) FROM ...)) AS DECIMAL(18,2))