Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server中带有case语句的更新查询中的聚合函数_Sql_Sql Server - Fatal编程技术网

sql server中带有case语句的更新查询中的聚合函数

sql server中带有case语句的更新查询中的聚合函数,sql,sql-server,Sql,Sql Server,我正在尝试使用聚合函数和case语句编写更新查询。 我是如何被困住的 最初,我编写了以下查询,该查询给了我一个错误:“在update语句中不能使用聚合函数 UPDATE report SET report.LoadDischargeQty = CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' AND cargo.CRG_Quantity is NOT NULL THEN cargo.CRG_Quantity ELSE CASE WHEN repo

我正在尝试使用聚合函数和case语句编写更新查询。 我是如何被困住的

最初,我编写了以下查询,该查询给了我一个错误:“在update语句中不能使用聚合函数

UPDATE report
SET report.LoadDischargeQty = 
CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' AND cargo.CRG_Quantity is NOT NULL THEN cargo.CRG_Quantity 
 ELSE
     CASE WHEN report.PlaId = 'LP' THEN 
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' THEN ISNULL(SUM(CRG_SFgrMT),0) END -  
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'A' THEN ISNULL(SUM(CRG_SFgrMT),0)END 
         WHEN report.PlaId = 'DP' THEN 
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'A' THEN ISNULL(SUM(CRG_SFgrMT),0) END-
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' THEN ISNULL(SUM(CRG_SFgrMT),0)END
        ELSE 0 END  
END 
from #CargoPerformanceReport report
INNER JOIN POSCARGO cargo ON cargo.POS_ID = report.PositionId AND ISNULL(cargo.CRG_Deleted,0)=0
所以我重构它如下

UPDATE report
SET report.LoadDischargeQty = 
CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' AND cargo.CRG_Quantity is NOT NULL THEN cargo.CRG_Quantity 
 ELSE
    select quantity.dischargeQuantity from (SELECT CASE WHEN report.PlaId = 'LP' THEN 
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' THEN ISNULL(SUM(CRG_SFgrMT),0) END -  
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'A' THEN ISNULL(SUM(CRG_SFgrMT),0)END 
         WHEN report.PlaId = 'DP' THEN 
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'A' THEN ISNULL(SUM(CRG_SFgrMT),0) END-
                                    CASE WHEN SUBSTRING(CRG_ArrDep,1,1) = 'D' THEN ISNULL(SUM(CRG_SFgrMT),0)END
        ELSE 0 END  dischargeQuantity ) quantity
END 
from #CargoPerformanceReport report
INNER JOIN POSCARGO cargo ON cargo.POS_ID = report.PositionId AND ISNULL(cargo.CRG_Deleted,0)=0
表结构

CREATE TABLE #CargoPerformanceReport
(
    PositionId              VARCHAR(12),
    PortAndActivityName     VARCHAR(100),
    PlaId                   VARCHAR(12),
    LoadDischargeQty            REAL,

);
插入#货物性能报告 值('100',null,'LP',null)

结果:-

PositionId |    PlaId | LoadDischargeQty
100        |     LP   | 150
但这不是正确的方法,也有错误


有人为相同的问题优化过解决方案吗?

将所有这些内容放入子查询:

SELECT LoadDischargeQty = 
  CASE 
    WHEN report.PlaId = 'LP' 
    THEN 1 
    ELSE -1 
  END * cargo.qty
FROM CargoPerformanceReport report
CROSS APPLY(
  SELECT SUM(
    CASE 
      WHEN CRG_ArrDep LIKE 'D%' 
      THEN 1 
      WHEN CRG_ArrDep LIKE 'A%' 
      THEN -1 
      ELSE 0
    END * ISNULL(CRG_SFgrMT, 0)
    ) qty
  FROM POSCARGO cargo
  WHERE cargo.POS_ID = report.PositionId 
    AND ISNULL(cargo.CRG_Deleted,0)=0
) cargo


我不明白应该如何使用
CRG\u Quantity
列,而您没有提供任何包含该数据的行,因此我将其删除以向您显示聚合本身。工作正常,您将获得150。您可以轻松地将其转换为
update
语句。

也许类似于此?
它使用带有汇总案例的案例

对sqlfiddle的测试

样本数据

IF OBJECT_ID('tempdb..#CargoPerformanceReport') IS NOT NULL DROP TABLE #CargoPerformanceReport;
CREATE TABLE #CargoPerformanceReport
(
    PositionId          VARCHAR(12) PRIMARY KEY,
    PortAndActivityName VARCHAR(100),
    PlaId               VARCHAR(12),
    LoadDischargeQty    REAL
);

IF OBJECT_ID('tempdb..#Poscargo') IS NOT NULL DROP TABLE #Poscargo;
CREATE TABLE #Poscargo
(
    POS_ID       VARCHAR(12),
    CRG_ArrDep   VARCHAR(3),
    CRG_SFgrMT   REAL,
    CRG_Quantity REAL,
    CRG_Deleted  BIT
);

Insert into #CargoPerformanceReport Values 
('100','name1','LP',null),
('101','name2','DP',null),
('102','name3','DP',null);

Insert Into #Poscargo(POS_ID, CRG_ArrDep, CRG_SFgrMT, CRG_Quantity, CRG_Deleted) Values 
 ('100','DD',100,null,0)
,('100','AD',100,null,0)
,('100','DD',200,null,0)
,('100','AD',50,null,0)
,('101','DL',100,null,0)
,('101','AL',200,null,0)
,('102','DL',100,500,0)
,('102','AL',200,null,0);
结果

PositionId PortAndActivityName PlaId LoadDischargeQty
---------- ------------------- ----- ----------------
100        name1               LP    150
101        name2               DP    100
102        name3               DP    500

你能提供一些样本数据并期望结果吗?这确实有助于提供格式而不是图像谢谢我更新了问题,现在你可以检查样本数据中的
CRG\u数量
CRG\u删除列在哪里了?我在深入查看了你的代码后删除了我的答案。这意味着什么:
CASE WHEN SUBSTRING(CRG_-ArrDep,1,1)='D'然后为空(CRG_-SFgrMT,0)结束-当子串(CRG_-ArrDep,1,1)='A'然后为空(CRG_-SFgrMT,0)结束时为空(CRG_-ArrDep,1,1)
?您的意思是当子串(CRG_-ArrDep,1,1)='D'然后为空(CRG_-SFgrMT 0)时为空(CRG_-SFgrMT结束
?不,先生,这不是我的要求。
IF OBJECT_ID('tempdb..#CargoPerformanceReport') IS NOT NULL DROP TABLE #CargoPerformanceReport;
CREATE TABLE #CargoPerformanceReport
(
    PositionId          VARCHAR(12) PRIMARY KEY,
    PortAndActivityName VARCHAR(100),
    PlaId               VARCHAR(12),
    LoadDischargeQty    REAL
);

IF OBJECT_ID('tempdb..#Poscargo') IS NOT NULL DROP TABLE #Poscargo;
CREATE TABLE #Poscargo
(
    POS_ID       VARCHAR(12),
    CRG_ArrDep   VARCHAR(3),
    CRG_SFgrMT   REAL,
    CRG_Quantity REAL,
    CRG_Deleted  BIT
);

Insert into #CargoPerformanceReport Values 
('100','name1','LP',null),
('101','name2','DP',null),
('102','name3','DP',null);

Insert Into #Poscargo(POS_ID, CRG_ArrDep, CRG_SFgrMT, CRG_Quantity, CRG_Deleted) Values 
 ('100','DD',100,null,0)
,('100','AD',100,null,0)
,('100','DD',200,null,0)
,('100','AD',50,null,0)
,('101','DL',100,null,0)
,('101','AL',200,null,0)
,('102','DL',100,500,0)
,('102','AL',200,null,0);
PositionId PortAndActivityName PlaId LoadDischargeQty
---------- ------------------- ----- ----------------
100        name1               LP    150
101        name2               DP    100
102        name3               DP    500