【问题标题】:Division column only returns one row除法列只返回一行
【发布时间】:2014-07-30 05:13:15
【问题描述】:

我正在编写一个SQL 查询来检查Gross Profit Percentage 数据库中的一组销售项目。

SELECT T0.[itmsgrpcod], 
       T0.sell, 
       T0.cost, 
       ( T0.sell / T0.cost ) AS "GP" 
FROM   (SELECT T0.[itmsgrpcod], 
               Sum(T1.[price])      AS "Sell", 
               Sum(T1.[stockprice]) AS "Cost" 
        FROM   inv1 T1 
               LEFT OUTER JOIN oitm T0 
                            ON T1.[itemcode] = T0.[itemcode] 
        GROUP  BY T0.[itmsgrpcod]) T0 

当我将SELECT 声明为:

SELECT T0.[ItmsGrpCod], T0.Sell, T0.Cost

它返回 96 行 - 正确的数量,填充了 Sell 和 Cost 数据。

当我添加列时:

    (T0.Sell / T0.Cost) as "GP"

它只返回查询的第一行,并正确计算了 GP。

【问题讨论】:

  • 我需要 GROUP BY,因为我正在尝试计算每个项目组的总销售额和成本,每个项目组有数百行。
  • 您能否尝试在SQL Fiddle 重现该问题,就像您使用小数据样本所遇到的一样?
  • 您刚刚添加了sap 标签。您能否详细说明它与问题的关系?
  • 数据库是 SAP Business One 数据库。
  • 您在哪里运行查询并获取结果?它是自定义应用程序还是像 SSMS 这样的工具?

标签: sql sql-server tsql sap


【解决方案1】:

事实证明,SAP Business One 的查询生成器不报告除零。当我在 SQL Server Management Studio 中尝试查询时,它提供了一个正确的除零错误,我解决了这个问题。

完整的查询,感兴趣的人:

SELECT T0.ItmsGrpCod,
       SUM(T1.Price) As "Sell",
       ISNULL(SUM(T1.StockPrice), 0) As "Cost",
       CASE WHEN SUM(T1.StockPrice) = 0 THEN 100 
            ELSE (SUM(T1.Price) - SUM(T1.StockPrice)) / SUM(T1.Price) * 100
       END As "GP"
FROM INV1 T1 LEFT OUTER JOIN OITM T0 ON T1.ItemCode = T0.ItemCode
GROUP BY T0.ItmsGrpCod
ORDER BY T0.ItmsGrpCod

【讨论】:

    【解决方案2】:

    你可以试试这个,我没有做太多。只需确保 Sell 和 Cost 转换为 Decimal。

    SELECT  T0.[ItmsGrpCod], 
            T0.Sell, 
            T0.Cost, 
            (T0.Sell / T0.Cost) as GP
    FROM    (SELECT     T0.[ItmsGrpCod], 
                        CAST(SUM(T1.[Price]) AS DECIMAL(12,2)) as Sell, 
                        CAST(SUM(T1.[StockPrice]) AS DECIMAL(12,2)) as Cost
            FROM        INV1 T1 
            LEFT JOIN   OITM T0 
            ON          T1.[ItemCode] = T0.[ItemCode]
            GROUP BY    T0.[ItmsGrpCod]) T0
    

    【讨论】:

    • 与没有强制转换的运行查询结果相同。
    【解决方案3】:

    我认为你对alias 有疑问

    试试这个

    SELECT T.[ItmsGrpCod],T.Sell,T.Cost, CAST(T.Sell AS Decimal) / T.Cost As GP
    FROM
        (
          SELECT T0.[ItmsGrpCod],SUM(T1.[Price]) As Sell,SUM(T1.[StockPrice]) As Cost
          FROM INV1 T1 LEFT OUTER JOIN OITM T0 ON T1.[ItemCode] = T0.[ItemCode]
          GROUP BY T0.[ItmsGrpCod]
        )T
    

    更新

    SELECT T.[ItmsGrpCod],T.Sell,T.Cost,T.GP
    FROM
        (
          SELECT T0.[ItmsGrpCod],
                 SUM(T1.[Price]) As Sell,
                 SUM(T1.[StockPrice]) As Cost,
                 SUM(T1.[Price]) / SUM(T1.[StockPrice]) As GP
          FROM INV1 T1 LEFT OUTER JOIN OITM T0 ON T1.[ItemCode] = T0.[ItemCode]
          GROUP BY T0.[ItmsGrpCod]
        )T
    

    【讨论】:

    • 我也想到了这一点,并且已经尝试将外部查询别名更改为不同的别名。不幸的是,结果还是一样。
    • 您是否尝试过更新查询,例如CAST(T.Sell AS Decimal) / T.Cost As GP@BenHarris
    • 是的 - 结果还是一样,只返回了一行。
    • @BenHarris 您是否仔细检查过SELECT T0.[ItmsGrpCod], T0.Sell, T0.Cost 没有GP 已返回96 行?
    • @BenHarris 你能给我一个小提琴样本
    【解决方案4】:

    作为这个线程中的每个人,甚至我都感到困惑和好奇。我添加了一些测试数据以查看发生了什么但是我无法复制您的场景。

    IF OBJECT_ID(N'TempINV1') > 0
        BEGIN
           DROP TABLE TempINV1
        END
    IF OBJECT_ID(N'TempOITM') > 0
        BEGIN
           DROP TABLE TempOITM
        END
    
    CREATE TABLE TempINV1 (ItemCode INT,
                       Price DECIMAL(8, 2),
                       StockPrice DECIMAL(8, 2))
    CREATE TABLE TempOITM (ItemCode INT,
                       ItmsGrpCod VARCHAR(10))
    
    INSERT INTO TempINV1
    VALUES
    (1, '3.21', '2.34'),
    (2, '4.32', '3.45'),
    (3, '5.43', '4.56')
    
    INSERT INTO TempOITM
    VALUES
    (1, 'Product1'),
    (2, 'Product2'),
    (3, 'Product3')
    

    您的两个 sacripts(以 Temp 为前缀的表名)输出相同数量的行项目

    SELECT T0.[ItmsGrpCod], T0.Sell, T0.Cost, (T0.Sell / T0.Cost) as "GP"
    FROM (
      SELECT T0.[ItmsGrpCod], SUM(T1.[Price]) as "Sell", SUM(T1.[StockPrice]) as "Cost"
      FROM TempINV1 T1 
      LEFT OUTER JOIN TempOITM T0 
      ON T1.[ItemCode] = T0.[ItemCode]
      GROUP BY T0.[ItmsGrpCod]) T0
    
    --Or
    
    SELECT T0.[ItmsGrpCod], T0.Sell, T0.Cost
    FROM (
      SELECT T0.[ItmsGrpCod], SUM(T1.[Price]) as "Sell", SUM(T1.[StockPrice]) as "Cost"
      FROM TempINV1 T1 
      LEFT OUTER JOIN TempOITM T0 
      ON T1.[ItemCode] = T0.[ItemCode]
      GROUP BY T0.[ItmsGrpCod]) T0
    

    两个查询的输出相同(返回的数量或行数)。

    请您在您的机器上运行脚本并确认是否属实。另外为了帮助我们更好地理解,如果您能提供一些示例日期,那就太好了。

    补偿除以零:

    SELECT T0.ItmsGrpCod,
          T0.Sell,
          T0.Cost,
          T0.Sell / CASE
                  WHEN ISNULL(T0.Cost, '0') = 0 THEN T0.Sell
                  ELSE T0.Cost
                  END AS "GP"
    FROM(SELECT T0.ItmsGrpCod,
              SUM(T1.Price)AS "Sell",
              SUM(T1.StockPrice)AS "Cost"
        FROM TempINV1 AS T1
            LEFT OUTER JOIN TempOITM AS T0
            ON T1.ItemCode = T0.ItemCode
        GROUP BY T0.ItmsGrpCod)AS T0
    

    【讨论】:

    • 感谢您的详细回答,但我发现了问题 - SAP Business One 报告了除零错误作为成功执行!
    • 哇,这解释了它。感谢您发布您的答案和发现。否则我会发疯的。我还修改了我的回复以补偿除以零错误。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多