【问题标题】:Finding each row's percentage of total查找每行占总数的百分比
【发布时间】:2017-05-29 00:03:13
【问题描述】:
SELECT I.[Order Number], SUM(CAST([Ext Price] AS FLOAT)) AS Rev 
        FROM stg.Invoices I 
        where i.[order number] = '64100097'
        GROUP BY I.[Order Number]

给我:

Order Number    Rev
64100097    124079.33

当我尝试使用以下方法获取每行收入的百分比时:

SELECT StgID,
CAST((CAST([Ext Price] AS FLOAT)) / (NULLIF(Rev,0)) AS FLOAT)
FROM stg.Invoices I
JOIN (
        SELECT I.[Order Number], 
        SUM(CAST([Ext Price] AS FLOAT)) AS Rev 
        FROM stg.Invoices I 
        where i.[order number] = '64100097'
        GROUP BY I.[Order Number]
) as TotRev on I.[Order Number] = TotRev.[Order Number]

我明白了:

StgID   RevPct
7006418 0.202934687026437
7006427 0.000460995397057673
7006417 0.0274442971282969
7006426 0.000415379418957211
7006422 0.0312703171430729
7006425 0.000609287622684616
7006424 0.0161187201768417
7006420 0.197365669205338
7006419 0.226870986489047
7006428 0.000134752500678397
7006421 0.10299056256993
7006423 0.193384345321658

总计:.08333333333

所有这些不应该等于 1 吗?

我不明白为什么我不能让每行加起来的总百分比为 100%。

这是证明所有这些都应该加起来的证据:

select stgid, [ext price]
from stg.Invoices
where [order number] = '64100097'


stgid   ext price
7006420 24489
7006418 25180
7006427 57.2
7006417 3405.27
7006426 51.54
7006421 12779
7006423 23995
7006422 3880
7006425 75.6
7006424 2000
7006419 28150
7006428 16.72

【问题讨论】:

  • 不要重复使用表别名。这太令人困惑了。
  • 您的数字加起来超过 0.083。第一个是 0.20。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

使用窗口函数:

SELECT I.[Order Number], SUM(CAST([Ext Price] AS FLOAT)) AS Rev ,
       SUM(CAST([Ext Price] AS FLOAT)) / NULLIF(SUM(SUM(CAST([Ext Price] AS FLOAT))) OVER (), 0) as p_rev
FROM stg.Invoices I 
WHERE i.[order number] = '64100097'
GROUP BY I.[Order Number];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多