Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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 SQL嵌套联接问题_Sql Server - Fatal编程技术网

Sql server SQL嵌套联接问题

Sql server SQL嵌套联接问题,sql-server,Sql Server,我花了很长时间才让我的查询正常工作。我有3个表(ORDERS、ORDERSITEMS、ORDERPAYMENTS),我正试图为每月到期销售税创建一个报告,如下所示: MONTH YEAR TOTAL RECEIPTS EXEMPT RECEIPTS NON-EXEMPT RECEIPTS SALES TAX 1 2020 $5,000 $4,500

我花了很长时间才让我的查询正常工作。我有3个表(ORDERS、ORDERSITEMS、ORDERPAYMENTS),我正试图为每月到期销售税创建一个报告,如下所示:

MONTH      YEAR        TOTAL RECEIPTS        EXEMPT RECEIPTS     NON-EXEMPT RECEIPTS        SALES TAX
1           2020        $5,000                $4,500                $500                      $31.25
SELECT StateAbbr,PaymentMonth,PaymentYear,SUM(TotalPayments),SUM(sales_tax),SUM(OrdersItems_Total)
FROM (
    Select
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(c.OrderPayments_Date) AS PaymentMonth,
        YEAR(c.OrderPayments_Date) AS PaymentYear,
        SUM(c.OrderPayments_Amount) AS TotalPayments,
        SUM(a.Order_SalesTax) AS sales_tax,
        0 as OrdersItems_Total
    FROM dbo.ORDERS a
       INNER JOIN ORDERPAYMENTS as c ON c.Order_FK = a.Order_ID
     WHERE a.stateTaxAbbreviation = 'MA' AND Month(c.OrderPayments_Date) = 1 AND YEAR(c.OrderPayments_Date) = 2020
     GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)

     UNION ALL


     Select
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(c.OrderPayments_Date) AS PaymentMonth,
        YEAR(c.OrderPayments_Date) AS PaymentYear,
        0 AS TotalPayments,
        0 AS sales_tax,
        SUM(B.OrdersItems_Total) as OrdersItems_Total

    FROM dbo.ORDERS a
     INNER JOIN ORDERITEMS b on b.Order_FK = a.Order_ID 
     WHERE a.stateTaxAbbreviation = 'MA' AND Month(b.OrderPayments_Date) = 1 AND YEAR(b.OrderPayments_Date) = 2020
     GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)
 )t
GROUP BY StateAbbr,PaymentMonth,PaymentYear
总收入:要获得此数字,您必须将给定时间范围内的所有C.OrderPayments\u金额相加,在这种情况下,月(C.OrderPayments\u日期)=1年(C.OrderPayments\u日期)=2020年

免税收据:您必须确定某个项目是否应纳税(例如,数字文件不应纳税,实物打印应纳税)。要获取此信息,您必须通过检查B.OrdersItems\u itemschargeSalestax来确定该项目是否应纳税。如果此字段为0,则不收取销售税;如果为1,则收取销售税。然后,您必须通过按B.ORDERSITEMS\u ItemChargeSalesTax=0的C.OrderPayments\u Date列进行分组进行筛选,以仅获取2020年1月时间范围内的ORDERSITEMS,最后将B.ORDERSITEMS\u总计添加到一起

非免税收据:要获取此数字,您需要对上述免税收据执行相同的操作,只需查找B.OrdersItems\u ItemChargeSalesTax=1并将B.OrdersItems\u总数相加

销售税:要获取此数字,请使用与月份(C.OrderPayments\u date)=1和年份(C.OrderPayments\u date)=2020之前相同的日期过滤器,然后将A.Order\u SalesTax列相加

我列出的第一个查询是working fine,它可以为我提供当月支付的总税款和总收入(现在我已经硬编码了WHERE语句,但这将通过我列表页面上的过滤器应用)。我 需要从ORDERSITEMS表中获取一个名为ORDERSITEMS_ItemTotal的字段,并对该字段求和,使其成为查询中的单行条目。我见过另一个人做嵌套联接。如有任何建议,将不胜感激

**ORDERS TABLE "A"**
  Order_ID, 
  Order_SalesTax,
  stateTaxAbbreviation

**ORDERSITEMS TABLE "B"**
  Order_FK,
  OrdersItems_ItemChargeSalesTax,
  OrdersItems_Total
注意:在ORDERSITEMS表中,单个订单可能会出现多次,因为一个订单上可能有许多项目

**ORDERPAYMENTS TABLE "C"**
  Order_FK,
  OrderPayments_PaymentDate,
  OrderPayments_Amount
注意:在ORDERPAYMENTS表中,一个订单可能会出现多次,因为一个订单上可能有多个付款

**ORDERPAYMENTS TABLE "C"**
  Order_FK,
  OrderPayments_PaymentDate,
  OrderPayments_Amount
虽然写出来似乎很容易,但当我试图把所有的数字放在一起时,数字是错误的,因为它会多次添加条目,因为订单上有多个项目,因此每次都会添加总付款

这是我一直在修补的代码,我非常感谢您的指导。提前谢谢你,希望我已经足够清楚地解释了我的情况

Select
    a.stateTaxAbbreviation AS StateAbbr,
    MONTH(c.OrderPayments_Date) AS PaymentMonth,
    YEAR(c.OrderPayments_Date) AS PaymentYear,
    SUM(c.OrderPayments_Amount) AS TotalPayments,
    SUM(a.Order_SalesTax) AS sales_tax
FROM dbo.ORDERS a
   INNER JOIN ORDERPAYMENTS as c ON c.Order_FK = a.Order_ID
      LEFT OUTER JOIN ORDERITEMS b on b.Order_FK = a.Order_ID 
  WHERE a.stateTaxAbbreviation = 'MA' AND Month(b.OrderPayments_Date) = 1 AND YEAR(b.OrderPayments_Date) = 2020
  GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)

您可能应该编写两个查询,一个用于加入ORDERPAYMENTS表,另一个用于加入ORDERITEMS表。然后你可以把它们和所有的联合起来

大概是这样的:

MONTH      YEAR        TOTAL RECEIPTS        EXEMPT RECEIPTS     NON-EXEMPT RECEIPTS        SALES TAX
1           2020        $5,000                $4,500                $500                      $31.25
SELECT StateAbbr,PaymentMonth,PaymentYear,SUM(TotalPayments),SUM(sales_tax),SUM(OrdersItems_Total)
FROM (
    Select
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(c.OrderPayments_Date) AS PaymentMonth,
        YEAR(c.OrderPayments_Date) AS PaymentYear,
        SUM(c.OrderPayments_Amount) AS TotalPayments,
        SUM(a.Order_SalesTax) AS sales_tax,
        0 as OrdersItems_Total
    FROM dbo.ORDERS a
       INNER JOIN ORDERPAYMENTS as c ON c.Order_FK = a.Order_ID
     WHERE a.stateTaxAbbreviation = 'MA' AND Month(c.OrderPayments_Date) = 1 AND YEAR(c.OrderPayments_Date) = 2020
     GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)

     UNION ALL


     Select
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(c.OrderPayments_Date) AS PaymentMonth,
        YEAR(c.OrderPayments_Date) AS PaymentYear,
        0 AS TotalPayments,
        0 AS sales_tax,
        SUM(B.OrdersItems_Total) as OrdersItems_Total

    FROM dbo.ORDERS a
     INNER JOIN ORDERITEMS b on b.Order_FK = a.Order_ID 
     WHERE a.stateTaxAbbreviation = 'MA' AND Month(b.OrderPayments_Date) = 1 AND YEAR(b.OrderPayments_Date) = 2020
     GROUP BY stateTaxAbbreviation , MONTH(c.OrderPayments_Date), Year(c.OrderPayments_Date)
 )t
GROUP BY StateAbbr,PaymentMonth,PaymentYear

感谢沃特为我指明了正确的方向。在看了他的建议后,我回去评估了我需要什么,并根据他的想法创建了有效的解决方案。谢谢你的耐心,你的洞察力帮了大忙

    Select StateAbbr, OrderYear, OrderMonth, SUM(TotalSales) As TotalSales, SUM(TotalSales)-SUM(TaxableRevenue) As ExemptRevenue, SUM(TaxableRevenue) As TaxableRevenue, SUM(SalesTax) As SalesTax
 FROM (
 Select
        /*Get Total Sales and Total Sales Tax Collected*/
        a.stateTaxAbbreviation AS StateAbbr,
        MONTH(a.Order_Date) As OrderMonth,
        YEAR(a.Order_Date) As OrderYear,
        SUM((a.Order_TotalBaseSale + a.Order_Shipping) - (((a.Order_PercentDiscount*a.Order_TotalBaseSale)/100) + a.Order_DollarDiscount)) As TotalSales,
        SUM(0) As ExemptRevenue,
        Sum(0) As TaxableRevenue,
        SUM(a.Order_SalesTax) AS SalesTax

 FROM dbo.ORDERS a
    WHERE a.Order_Status != 'Cancelled'
    Group By a.stateTaxAbbreviation, MONTH(a.Order_Date), YEAR(a.Order_Date)

    UNION ALL

Select
    /*GET EXEMPT ORDERS*/
    a.stateTaxAbbreviation AS StateAbbr,
    MONTH(a.Order_Date) As OrderMonth,
    YEAR(a.Order_Date) As OrderYear,
    Sum(0) As TotalSales,
    Sum(OrdersItems_ItemTotal) AS ExemptRevenue,
    Sum(0) AS TaxableRevenue,
    Sum(0) As SalesTax

FROM ORDERSITEMS b
LEFT JOIN ORDERS a ON Order_ID = b.Order_FK
    WHERE b.OrdersItems_ItemChargeSalesTax = 0 and a.Order_Status != 'Cancelled'
    Group By a.stateTaxAbbreviation, MONTH(a.Order_Date), YEAR(a.Order_Date)

    UNION ALL
Select
    /*GET NON-EXEMPT ORDERS*/
    a.stateTaxAbbreviation AS StateAbbr,
    MONTH(a.Order_Date) As OrderMonth,
    YEAR(a.Order_Date) As OrderYear,
    SUM(0) As TotalSales,
    SUM(0) AS ExemptRevenue,
    Sum(OrdersItems_ItemTotal) AS TaxableRevenue,
    Sum(0) As SalesTax

FROM ORDERSITEMS b
LEFT JOIN ORDERS a ON Order_ID = b.Order_FK
WHERE b.OrdersItems_ItemChargeSalesTax <> 0 and a.Order_Status != 'Cancelled'
Group By a.stateTaxAbbreviation, MONTH(a.Order_Date), YEAR(a.Order_Date)
)t

GROUP BY StateAbbr, OrderMonth, OrderYear
ORDER BY StateAbbr ASC, OrderYear DESC, OrderMonth ASC
选择StateAbr、OrderYear、OrderMonth、SUM(TotalSales)作为TotalSales、SUM(TotalSales)-SUM(TaxableRevenue)作为免税收入、SUM(TaxableRevenue)作为TaxableRevenue、SUM(SalesTax)作为SalesTax
从(
挑选
/*获取已征收的总销售额和总销售税*/
a、 StateTax缩写为stateAbr,
月份(a.订单日期)作为订单月份,
年(a.订单日期)为订单年,
总计((a.订单\u TotalBaseSale+a.订单\u发货)-((a.订单\u百分比折扣*a.订单\u TotalBaseSale)/100)+a.订单\u美元),
免税收入总额(0),
应纳税收入总额(0),
销售税总额(a.订单\销售税)
来自dbo.a订单
其中a.Order_状态!=“已取消”
按a.stateTax缩写、月份(a.Order\u日期)、年份(a.Order\u日期)分组
联合所有
挑选
/*获得豁免订单*/
a、 StateTax缩写为stateAbr,
月份(a.订单日期)作为订单月份,
年(a.订单日期)为订单年,
总和(0)为总销售额,
免税收入总额(OrdersItems\u ItemTotal),
应纳税收入总额(0),
销售税总额(0)
从订单站点b
左连接订单a ON Order\u ID=b.Order\u FK
其中b.OrdersItems\u ItemChargeSalesTax=0和a.Order\u Status!=“已取消”
按a.stateTax缩写、月份(a.Order\u日期)、年份(a.Order\u日期)分组
联合所有
挑选
/*获得非豁免订单*/
a、 StateTax缩写为stateAbr,
月份(a.订单日期)作为订单月份,
年(a.订单日期)为订单年,
总和(0)为总销售额,
免税收入总额(0),
总额(OrdersItems\u ItemTotal)作为应纳税收入,
销售税总额(0)
从订单站点b
左连接订单a ON Order\u ID=b.Order\u FK
其中b.OrdersItems\u ItemChargeSalesTax 0和a.Order\u状态!=“已取消”
按a.stateTax缩写、月份(a.Order\u日期)、年份(a.Order\u日期)分组
)t
按状态分组br、OrderMonth、OrderYear
按州订购abbr ASC、OrderYear DESC、OrderMonth ASC

为什么ORDERITEMS有OrderPayments\u Date列?这似乎没有什么意义(而且您没有将其包含在您的伪DDL中)。如果物品在发货时要交税,那么物品和发货之间应该有直接的关系(如果这是您的目标)。或者OrderPayments\u Date实际上是OrderPayments中的OrderPayments\u PaymentDate?Hi-SMor:OrderPayments\u Date是ORDERSPAYMENTS表中的一列。这是订单上的付款日期。它仅用于按月/年过滤结果,以便我可以运行报告,比如2020年1月或2019年12月等,并查看应向州政府缴纳的销售税。销售税由制片厂在付款时征收。。。然而,在我们的情况下,同样的钱每个月都会被送到州政府,所以我们需要报告我们欠了多少钱,这样我们就可以提交月度纳税申报表并汇款。而且,我相信我