1

我的数据集如下所示:

COLA  | COLB
Name1 | 218
Name2 | 157
Name3 | 134
Name4 | 121

我需要这个输出:

COLA  | COLB| COLC
Name1 | 218 | 0.34
Name2 | 157 | 0.60
Name3 | 134 | 0.71
Name4 | 121 | 1

到目前为止,我的 SQL 看起来像这样:

SELECT COLA, COLB, COLB/SUM(COLB) FROM #MyTempTable

这个 SQL 有两个问题。一,COLC每次都是0,我不明白。第二,即使它确实导致了 %,它也不是累积的 %。

我在 StackOverflow 上看到了一些类似的线程,但我无法让这些线程的答案在我的确切场景中起作用。

在此先感谢您的任何建议!

4

3 回答 3

4

我认为您正在寻找类似的东西,尽管您的示例计算可能有点偏离:

SELECT
    COLA,
    COLB,
    ROUND(
        -- Divide the running total...
        (SELECT CAST(SUM(COLB) AS FLOAT) FROM #MyTempTable WHERE COLA <= a.COLA) /
        -- ...by the full total
        (SELECT CAST(SUM(COLB) AS FLOAT) FROM #MyTempTable),
        2
    ) AS COLC
FROM #MyTempTable AS a
ORDER BY COLA

编辑:我添加了舍入。

这给了我们以下输出:

COLA    COLB    COLC
Name1   218     0.35
Name2   157     0.6
Name3   134     0.81
Name4   121     1

您的结果为 0(或 1)的原因是因为您将整数除以整数,从而给您一个整数(请参阅数据类型优先级)。

更新:

我应该补充一点,这使用“三角连接”来获得运行总数(WHERE COLA <= a.COLA)。根据您的 SQL Server 版本,如果性能成为问题,您可以将其与其他选项进行比较。

于 2012-08-28T14:06:11.153 回答
1

如果你不使用 OLAP 函数,那么你必须在表上做一个奇怪的自连接:

SELECT a.ColA, a.ColB, SUM(b.ColB) AS ColX
  FROM #MyTempTable AS a
  JOIN #MyTempTable AS b
    ON a.ColA <= b.ColA
 GROUP BY a.ColA, a.ColB

这为您提供了原始累积 SUM。您绝对可以将其用作子查询来获得答案,注意要获得百分比,您需要将累积总和除以总和:

SELECT ColA, ColB, ColX / (SELECT SUM(ColB) FROM MyTempTable) AS ColC
  FROM (SELECT a.ColA, a.ColB, SUM(b.ColB) AS ColX
          FROM #MyTempTable AS a
          JOIN #MyTempTable AS b
            ON a.ColA <= b.ColA
         GROUP BY a.ColA, a.ColB
       ) AS X
 ORDER BY ColA

你可以只写:

SELECT a.ColA, a.ColB, SUM(b.ColB) / (SELECT SUM(ColB) FROM MyTempTable) AS ColC
  FROM #MyTempTable AS a
  JOIN #MyTempTable AS b
    ON a.ColA <= b.ColA
 GROUP BY a.ColA, a.ColB
 ORDER BY a.ColA

将 ColC 表达式乘以 100 以获得百分比而不是分数。

在 Mac OS X 10.7.3 上针对 IBM Informix 11.70.FC2 进行了测试,这两个查询都具有除法工作,产生了相同的答案(我注意到我得到了 0.81 而不是问题中要求的 0.71):

Name1    218    0.34603174603174603174603174603175
Name2    157    0.5952380952380952380952380952381
Name3    134    0.80793650793650793650793650793651
Name4    121    1.0 

您可能必须使用 CAST 来确保使用浮点而不是整数算术来完成除法 - 正如您所看到的,这对于 Informix 不是必需的(无论如何,SUM 都是浮点小数,以防万一表有数十亿其中的行数,而不仅仅是其中的 4 个)。我可以改进演示文稿ROUND(xxxx, 2),只保留 2 个小数位;转换为 DECIMAL(6,2) 将获得相同的结果,但客户端应负责演示,而不是 DBMS。

于 2012-08-28T14:05:23.127 回答
0

在 MS SQL Server 中,这样做(ups,错误的子聚合 -> 错误的结果):

create table #MyTempTable (cola varchar(10), colb int)

insert into #MyTempTable(cola,colb)
select 'Name1',218
union all
select 'Name2',157
union all
select 'Name3',134
union all
select 'Name4',121

SELECT otab.COLA, otab.COLB,
       cast(otab.COLB as float)/(select SUM(cast(itab.colb as float))
                                 from #MyTempTable itab where itab.cola >= otab.cola) 
  from #MyTempTable otab

drop table #MyTempTable
于 2012-08-28T14:14:08.023 回答