簡體   English   中英

錯誤! -不能在用於GROUP BY子句的group by列表的表達式中使用聚合或子查詢

[英]ERROR! - Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause

我收到此錯誤:無法在用於GROUP BY子句的group by列表的表達式中使用聚合或子查詢。

我環顧四周,但找不到任何可以幫助我的情況。

我正在使用SQL Server 2012

SELECT DISTINCT 
CommodityCode.CommodityCode AS ComCode, 
Facility.FacilityAcctNum, 
Vessel.VesselType, 
Facility.FacilityNm, 
 Case
      When Commodities.ShippedReceivedId = 'R' And Commodities.ForeignDomesticId = 'F' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End AS RecF,

     Case
      When Commodities.ShippedReceivedId = 'R' And Commodities.ForeignDomesticId = 'D' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End AS RecD,

     Case
      When Commodities.ShippedReceivedId = 'S' And Commodities.ForeignDomesticId = 'D' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End AS Shipped,

     Case
      When Commodities.ShippedReceivedId = 'S' And Commodities.ForeignDomesticId = 'F' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End AS ShippedF,
Commodities.Destination,
Commodities.Origin, 
Commodities.Specific, 
CommodityCode.Descr, 
Facility.FacilityID, 
TransactionCharge.ArrivalDt, 
TransactionCharge.DepartDt, 
TransactionCharge.DtDocked, 
TransactionCharge.DtSailed

FROM Vessel 
INNER JOIN Commodities 
INNER JOIN CommodityCode ON Commodities.CommodityCode = CommodityCode.CommodityCode 
INNER JOIN TransactionCharge ON Commodities.TransactionID = TransactionCharge.TransactionID ON Vessel.VesselID = TransactionCharge.VesselId 
INNER JOIN Facility ON TransactionCharge.FacilityID = Facility.FacilityID 
INNER JOIN Unit ON Commodities.Unit = Unit.Unit 
INNER JOIN TransactionFee ON TransactionCharge.TransactionID = TransactionFee.TransactionID

GROUP BY 
CommodityCode.CommodityCode, 
Facility.FacilityAcctNum, 
Vessel.VesselType, 
Facility.FacilityNm, 
Commodities.Destination, 
Commodities.Origin, 
Commodities.Specific, 
CommodityCode.Descr, 
Facility.FacilityID, 
Case
      When Commodities.ShippedReceivedId = 'R' And Commodities.ForeignDomesticId = 'F' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
         )
         End
      Else 0
      End,

     Case
      When Commodities.ShippedReceivedId = 'R' And Commodities.ForeignDomesticId = 'D' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End,

     Case
      When Commodities.ShippedReceivedId = 'S' And Commodities.ForeignDomesticId = 'D' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End,

     Case
      When Commodities.ShippedReceivedId = 'S' And Commodities.ForeignDomesticId = 'F' Then
     Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
        Else
        Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
              Where CommodityCode.CommodityCode = Commodities.CommodityCode)
        Else (Select ShortTonFactor From Unit
              Where Unit.Unit = Commodities.Unit) End,2
          )
         End
      Else 0
      End,
TransactionCharge.ArrivalDt, 
TransactionCharge.DepartDt, 
TransactionCharge.DtDocked, 
TransactionCharge.DtSailed

HAVING (Vessel.VesselType='V' Or Vessel.VesselType='O')

您的GROUP BY中的case語句中有子查詢。 例如,查看case語句的第一部分:

When Commodities.ShippedReceivedId = 'R' And Commodities.ForeignDomesticId = 'F' Then
 Case When Commodities.Amount Is Null Or Commodities.Unit Is Null Then Null
    Else
    Round (Commodities.Amount/Case When Commodities.Unit = 'B' Then (Select BushelFactor From CommodityCode
          Where CommodityCode.CommodityCode = Commodities.CommodityCode)
    Else (Select ShortTonFactor From Unit
          Where Unit.Unit = Commodities.Unit) End,2
     )
     End
  Else 0
  End,

首先有兩個選項,以Select BushelFactor...Select ShortTonFactor...開頭,因此您必須將其刪除。

我很快就重新格式化了您的查詢並刪除/評論了其中的一些問題:

SELECT --DISTINCT - do you really want DISTINCT?
    cc.CommodityCode AS ComCode, 
    f.FacilityAcctNum, 
    v.VesselType, 
    f.FacilityNm, 
    CASE
        WHEN Commodities.ShippedReceivedId = 'R' AND Commodities.ForeignDomesticId = 'F' THEN
        CASE 
            WHEN Commodities.Amount IS NULL OR Commodities.Unit IS NULL THEN NULL
            ELSE ROUND(Commodities.Amount /
                CASE 
                    WHEN Commodities.Unit = 'B' THEN cc.BushelFactor
                    ELSE u.ShortTonFactor 
                END, 2)
        END
        ELSE 0
    END AS RecF,
    CASE
        WHEN Commodities.ShippedReceivedId = 'R' AND Commodities.ForeignDomesticId = 'D' THEN
        CASE 
            WHEN Commodities.Amount IS NULL OR Commodities.Unit IS NULL THEN NULL
            ELSE
            ROUND(Commodities.Amount /
                CASE 
                    WHEN Commodities.Unit = 'B' THEN cc.BushelFactor
                    ELSE u.ShortTonFactor END, 2)
        END
        ELSE 0
    END AS RecD,
    CASE
        WHEN Commodities.ShippedReceivedId = 'S' AND Commodities.ForeignDomesticId = 'D' THEN
        CASE 
            WHEN Commodities.Amount IS NULL OR Commodities.Unit IS NULL THEN NULL
            ELSE
            ROUND(Commodities.Amount / 
                CASE 
                    WHEN Commodities.Unit = 'B' THEN cc.BushelFactor
                    ELSE u.ShortTonFactor
                END, 2)
        END
        ELSE 0
    END AS Shipped,
    CASE
        WHEN Commodities.ShippedReceivedId = 'S' AND Commodities.ForeignDomesticId = 'F' THEN
        CASE 
            WHEN Commodities.Amount IS NULL OR Commodities.Unit IS NULL THEN NULL
            ELSE
            ROUND(Commodities.Amount/ 
                CASE 
                    WHEN Commodities.Unit = 'B' THEN cc.BushelFactor
                    ELSE u.ShortTonFactor
                END, 2)
        END
        ELSE 0
    END AS ShippedF,
    c.Destination,
    c.Origin, 
    c.Specific, 
    cc.Descr, 
    f.FacilityID, 
    tc.ArrivalDt, 
    tc.DepartDt, 
    tc.DtDocked, 
    tc.DtSailed
FROM 
    Vessel v
    INNER JOIN Commodities c ON --some_condtion, OR is this a cross join?
    INNER JOIN CommodityCode cc ON c.CommodityCode = cc.CommodityCode 
    INNER JOIN TransactionCharge tc ON c.TransactionID = tc.TransactionID AND v.VesselID = tc.VesselId 
    INNER JOIN Facility f ON tc.FacilityID = f.FacilityID 
    INNER JOIN Unit u ON c.Unit = u.Unit 
    INNER JOIN TransactionFee td ON tc.TransactionID = tf.TransactionID
WHERE
    v.VesselType IN ('V', 'O');

我不希望這會產生您想要的答案,但是由於邏輯已被簡化,因此它可能更容易發現原始查詢的問題所在?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM