SQL内部联接和子查询

SQL内部联接和子查询,sql,sql-server,subquery,inner-join,Sql,Sql Server,Subquery,Inner Join,我写了下面的语句,它返回了我要查找的数据,显示了添加到OrderNo中的每个客户费用的多行。我希望合并一个子查询,返回FK_OrderNo的总成本(总和) 例如,订单号4915有4个客户费用,所以在它显示4个条目之后,我想有一行显示总费用。请参阅下面的图片链接,了解我当前获得的结果 以下是我目前的代码: ![Use AirTrak SELECT PK_OrderNo ,Housebill ,OrgAirport ,DestAirport ,Cal

我写了下面的语句,它返回了我要查找的数据,显示了添加到OrderNo中的每个客户费用的多行。我希望合并一个子查询,返回FK_OrderNo的总成本(总和)

例如,订单号4915有4个客户费用,所以在它显示4个条目之后,我想有一行显示总费用。请参阅下面的图片链接,了解我当前获得的结果

以下是我目前的代码:

![Use AirTrak
SELECT PK_OrderNo
      ,Housebill
      ,OrgAirport
      ,DestAirport
      ,CallIn
      ,CallInName
      ,Description
      ,APARType
      ,Total
      ,TotalMiles
      ,OrderDate
      ,PODDateTime
      ,ShipmentDateTime
      ,InvoiceDateTime

From dbo.tbl_ShipmentHeader as SH
     Inner Join dbo.tbl_ShipmentAPAR as SC
      On SH.PK_OrderNo = SC.FK_OrderNo
        where SH.BillNo = 2003 and
        SC.APARCode= 'C'

如果您想要一个新行,您必须在第二个查询中获得总和。 使用UNION ALL,您可以合并这两个集合。如果没有ALL关键字,它将在您的集合上执行一个独特的操作

DECLARE
    @Bill INT = 2003;

SELECT PK_OrderNo
      ,Housebill
      ,OrgAirport
      ,DestAirport
      ,CallIn
      ,CallInName
      ,Description
      ,APARType
      ,Total
      ,TotalMiles
      ,OrderDate
      ,PODDateTime
      ,ShipmentDateTime
      ,InvoiceDateTime

From dbo.tbl_ShipmentHeader as SH
     Inner Join dbo.tbl_ShipmentAPAR as SC
      On SH.PK_OrderNo = SC.FK_OrderNo
        where SH.BillNo = @Bill  and
        SC.APARCode= 'C'
UNION ALL
SELECT PK_OrderNo
      ,NULL
      ,NULL
      ,NULL
      ,NULL
      ,NULL
      ,NULL
      ,NULL
      ,SUM(Total)Total
      ,NULL
      ,NULL
      ,NULL
      ,NULL
      ,NULL

From dbo.tbl_ShipmentHeader as SH
     Inner Join dbo.tbl_ShipmentAPAR as SC
      On SH.PK_OrderNo = SC.FK_OrderNo
        where SH.BillNo = @Bill and
        SC.APARCode= 'C'
GROUP BY
    PK_OrderNo

你可以通过分组汇总来完成!这是一个示例,不是您的数据,但我认为易于理解并可根据您的需要进行自定义:

DECLARE @orders TABLE
(
    orderID INT,
    item VARCHAR(30),
    quantity INT,
    price float
)

INSERT INTO @orders
VALUES
(1,'Daiwa Aqualite Powerfloat',1,74.90),
(1,'Berkleys Firewire',220,0.12),
(1,'Cat Boilies Blood Flavour',1,6.49),
(1,'Black Cat Dead Bait Rig',2,5.00),
(2,'Shimano Alivio DX',1,69.90),
(2,'MAD Carpline',250,0.08),
(2,'Alfa Boilies 1KG Tutti Frutti',1,6.49),
(2,'Exner Strong Waggler 8g',1,5.25)

SELECT  orderID,
        CASE WHEN orderID IS NULL
            THEN '--   GRAND TOTAL   --'
            ELSE COALESCE(item,'- TOTAL FOR ORDER ' + CAST(orderID AS VARCHAR(5)) + '-')
        END AS item,
        SUM(quantity * price) as linetotal
FROM     @orders
GROUP BY ROLLUP(orderID, item);

请尝试以下查询。由于结果不是唯一的,所以总金额将被重复

SELECT
  PK_OrderNo,
  Housebill,
  OrgAirport,
  DestAirport,
  CallIn,
  CallInName,
  Description,
  APARType,
  Total,
  TotalMiles,
  OrderDate,
  PODDateTime,
  ShipmentDateTime,
  InvoiceDateTime,
  sd.total_charge
FROM (SELECT
       PK_OrderNo,
       SUM(charge) total_charge
     FROM /*your charge table*/
     GROUP BY PK_OrderNo) sd,
     dbo.tbl_ShipmentHeader AS SH
     INNER JOIN dbo.tbl_ShipmentAPAR AS SC
       ON SH.PK_OrderNo = SC.FK_OrderNo
WHERE SH.BillNo = 2003
AND SC.APARCode = 'C'
AND charge_table.PK_OrderNo = SH.PK_OrderNo

你能提供你的预期产出吗?这是sql server还是mysql?假设这是mysql,您需要在第二个查询中使用UNION来获取总数。预期的输出将是PK_OrderNumber的总和。例如,4915有4项费用,共计1148.35美元。我想在4项费用下显示一行,显示总计。此外,我更新了帖子,使其仅为SQL Server,而不是我的SQL。很抱歉,谢谢你的邮件。当我运行该查询时,它只会报告相同的信息,除了它现在按订单号排序。CeOnSql,我喜欢您的做法,但是,SSMS不喜欢CASE语句。它说它需要“(”或select。与其像您那样做,我该如何做:对于具有相同FK_OrderNo的每个PKSEQ,求和totals字段并将其输出到名为Shipping Total的字段?在构建case语句之前,我将使用
select orderID,item,sum执行查询(在上面的示例中)(数量*价格)如linetotal…
则您可以查看输出内容,从而更容易构建良好的案例陈述。查看此链接,它帮助我了解了
汇总的工作原理: