Sql server SQL嵌套联接问题
我花了很长时间才让我的查询正常工作。我有3个表(ORDERS、ORDERSITEMS、ORDERPAYMENTS),我正试图为每月到期销售税创建一个报告,如下所示: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
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月等,并查看应向州政府缴纳的销售税。销售税由制片厂在付款时征收。。。然而,在我们的情况下,同样的钱每个月都会被送到州政府,所以我们需要报告我们欠了多少钱,这样我们就可以提交月度纳税申报表并汇款。而且,我相信我