首页 > 解决方案 > 我刚开始学习SQL,但无法进行查询,您能帮帮我吗?

问题描述

sql查询中有一个字段我做不到。首先,必须在下表中添加一个新列。此列的值需要是完成百分比,所以它是一个百分比值。例如,Cupboard=1 架子上有 7 个值。IsCounted 在这里,其中 3 个被计算在内。换句话说,Cupboard = 1 的那些应该将 3/7 的百分比值写为要创建的新列中的值。如果其他人的 IsCounted 为 0,它将写入 0%。我怎样才能做到这一点?

我的 Sql 代码:

SELECT a.RegionName,
       a.Cupboard,
       a.Shelf,
       (CASE WHEN ToplamSayım > 0 THEN 1 ELSE 0 END) AS IsCounted
FROM (SELECT p.RegionName,
             r.Shelf,
             r.Cupboard,
             (SELECT COUNT(*)
              FROM FAZIKI.dbo.PM_ProductCountingNew
              WHERE RegionCupboardShelfTypeId = r.Id) AS ToplamSayım
      FROM FAZIKI.dbo.DF_PMRegionType p
          JOIN FAZIKI.dbo.DF_PMRegionCupboardShelfType r ON p.Id = r.RegionTypeId
      WHERE p.WarehouseId = 45) a
ORDER BY a.RegionName;

结果如下图所示:

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


看起来窗口AVG应该可以解决问题,尽管尚不完全清楚分区列应该是什么。

SELECT COUNT可以简化为EXISTS

SELECT a.RegionName,
       a.Cupboard,
       a.Shelf,
       a.IsCounted,
       AVG(a.IsCounted * 1.0) OVER (PARTITION BY a.RegionName, a.Cupboard) Percentage
FROM (
      SELECT p.RegionName,
             r.Shelf,
             r.Cupboard,
             CASE WHEN EXISTS (SELECT 1
                 FROM FAZIKI.dbo.PM_ProductCountingNew pcn
                 WHERE pcn.RegionCupboardShelfTypeId = r.Id
             ) THEN 1 ELSE 0 END AS IsCounted
      FROM FAZIKI.dbo.DF_PMRegionType p
          JOIN FAZIKI.dbo.DF_PMRegionCupboardShelfType r ON p.Id = r.RegionTypeId
      WHERE p.WarehouseId = 45
) a
ORDER BY a.RegionName;

推荐阅读