为什么此SUM()字段无法按预期工作?

问题描述 投票:0回答:1

您能否解释一下为什么该查询未按预期执行SUM(LI.Unidades)?我希望将所有具有相同LINECOUNT的行加在一起。

首先,我在选择和分组依据中也有LI.Unidades(也需要没有SUM()的LI.Unidades字段,但我只是为了测试而删除了它,但仍然没有正确添加。

SELECT
CASE AL.CodigoEmpresa WHEN 1 THEN '802' WHEN 100 THEN '801' ELSE 'N/A' END AS 'COMPANYID',
D365.Account as 'CUSTACCOUNT',
SUM(LI.Unidades) as 'GROSSWEIGHT',
AL.NumeroLineas as 'LINECOUNT', 
'KG' as 'SALESUNIT',
LI.ImporteBruto as 'GROSSAMOUNT'

FROM CabeceraAlbaranCliente AL inner join LineasAlbaranCliente LI on (AL.NumeroAlbaran = LI.NumeroAlbaran and AL.FechaAlbaran = Li.FechaAlbaran and AL.CodigoEmpresa = LI.CodigoEmpresa)
inner join AALPLA_D365Customers D365 on (AL.CifEuropeo = D365.Tax_exempt_number and D365.Plant = AL.CodigoEmpresa)

WHERE AL.EjercicioAlbaran = '2020' and AL.NumeroAlbaran = '14424' 

GROUP BY D365.Account, AL.CodigoEmpresa, AL.NumeroAlbaran, AL.NumeroLineas, LI.ImporteBruto

这是我得到的结果:

COMPANYID   CUSTACCOUNT GROSSWEIGHT LINECOUNT   SALESUNIT   GROSSAMOUNT
802         40801       0.0000000000    4       KG           555
802         40801       1.0000000000    4       KG           3000
802         40801       4.0000000000    4       KG           1280
802         40801       16.000000000    4       KG           112
802         40801       100.00000000    13      KG           3123
802         40801       225.00000000    13      KG           11
802         40801       500.00000000    13      KG           100
802         40801       550.00000000    13      KG           30
802         40801       750.00000000    13      KG           12
802         40801       1000.0000000    13      KG           1247
802         40801       1080.0000000    13      KG           1
802         40801       1125.0000000    13      KG           8
802         40801       1200.0000000    13      KG           1765
802         40801       1375.0000000    13      KG           987
802         40801       1475.0000000    13      KG           40
802         40801       2425.0000000    13      KG           30
802        40801        7075.0000000    13      KG           984

我想要的是:

COMPANYID   CUSTACCOUNT GROSSWEIGHT LINECOUNT   SALESUNIT   GROSSAMOUNT
802         40801       21.000000000    4       KG           555
802         40801       21.000000000    4       KG           3000
802         40801       21.000000000    4       KG           1280
802         40801       21.000000000    4       KG           112
802         40801       18880.000000    13      KG           3123
802         40801       18880.000000    13      KG           11
802         40801       18880.000000    13      KG           100
802         40801       18880.000000    13      KG           30
802         40801       18880.000000    13      KG           12
802         40801       18880.000000    13      KG           1247
802         40801       18880.000000    13      KG           1
802         40801       18880.000000    13      KG           8
802         40801       18880.000000    13      KG           1765
802         40801       18880.000000    13      KG           987
802         40801       18880.000000    13      KG           40
802         40801       18880.000000    13      KG           30
802         40801       18880.000000    13      KG           984
sql sql-server sql-server-2014
1个回答
2
投票

我认为您需要累加的总和,而不是合计:

SELECT (CASE AL.CodigoEmpresa WHEN 1 THEN '802' WHEN 100 THEN '801' ELSE 'N/A' END) AS COMPANYID,
       D365.Account as 'CUSTACCOUNT',
       SUM(LI.Unidades) OVER (ORDER BY LI.Unidades) as GROSSWEIGHT,
       AL.NumeroLineas as LINECOUNT, 
       'KG' as SALESUNIT,
       LI.ImporteBruto as GROSSAMOUNT
FROM CabeceraAlbaranCliente AL inner join
     LineasAlbaranCliente LI 
     ON AL.NumeroAlbaran = LI.NumeroAlbaran and
        AL.FechaAlbaran = Li.FechaAlbaran and
        AL.CodigoEmpresa = LI.CodigoEmpresa inner join
        AALPLA_D365Customers D365
        on AL.CifEuropeo = D365.Tax_exempt_number and
          D365.Plant = AL.CodigoEmpresa
WHERE AL.EjercicioAlbaran = '2020' and AL.NumeroAlbaran = '14424' 

0
投票

如果我正确地理解了这种情况,那么对意外结果的一种可能的解释是,您要根据CASE AL.CodigoEmpresa WHEN 1 THEN '802' WHEN 100 THEN '801' ELSE 'N/A' END进行分组,但实际的分组是根据AL.CodigoEmpresa进行分组(当然,所有其他列也是如此。

您需要更改GROUP BY子句:

SELECT
    CASE AL.CodigoEmpresa WHEN 1 THEN '802' WHEN 100 THEN '801' ELSE 'N/A' END AS 'COMPANYID',
    D365.Account as 'CUSTACCOUNT',
    SUM(LI.Unidades) OVER (PARTITION BY ) as 'GROSSWEIGHT',
    AL.NumeroLineas as 'LINECOUNT', 
    'KG' as 'SALESUNIT',
    LI.ImporteBruto as 'GROSSAMOUNT'
FROM CabeceraAlbaranCliente AL 
inner join LineasAlbaranCliente LI on (AL.NumeroAlbaran = LI.NumeroAlbaran and AL.FechaAlbaran = Li.FechaAlbaran and AL.CodigoEmpresa = LI.CodigoEmpresa)
inner join AALPLA_D365Customers D365 on (AL.CifEuropeo = D365.Tax_exempt_number and D365.Plant = AL.CodigoEmpresa)
WHERE AL.EjercicioAlbaran = '2020' and AL.NumeroAlbaran = '14424' 
GROUP BY 
    D365.Account, 
    CASE AL.CodigoEmpresa WHEN 1 THEN '802' WHEN 100 THEN '801' ELSE 'N/A' END,
    AL.NumeroAlbaran, AL.NumeroLineas, LI.ImporteBruto
© www.soinside.com 2019 - 2024. All rights reserved.