找出哪些OrderID是0 $ Payment Totals

时间:2014-04-14 15:36:24

标签: sql sql-server sql-server-2012

我需要一些帮助来编写一个SQL 2012查询来帮助我查找和mark orderID,这是由于逆转而支付的0.00美元

到目前为止,我有:

Select Distinct a.orderID, a.orderPaid,
    (Select SUM((c1.linePrice + c1.lineShippingCost + c1.lineTaxCost + c1.lineOptionCost) * c1.lineQuantity) 
            From vwSelectOrderLineItems c1 Where c1.orderID = a.orderID) As OrderAmount,
    (Select SUM(b1.payAmount) FROM vwSelectOrderPayments b1 Where b1.orderID = a.orderID) as Payment,
    1 As IsReversal
From vwSelectOrders a
Left Outer Join vwSelectOrderPayments b On b.orderID = a.orderID
Where b.payValid = 1 AND a.orderPaid = 0

对于某些订单,我会收到0美元的付款。当我用这些记录的orderID查询该支付表时,我可以看到已经发布了2个付款... 1原始付款,2反转。

我如何flag {0}付款Orders

Oders

CREATE TABLE [dbo].[TblOrders](
    [orderID] [bigint] IDENTITY(1000,1) NOT NULL,
    [orderPaid] [bit] NOT NULL,
    [orderPaidOn] [datetime] NULL
 CONSTRAINT [PK_TblOrders] PRIMARY KEY CLUSTERED 
(
    [orderID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 50) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[TblOrders] ADD  CONSTRAINT [DF__TblOrders__order__1975C517]  DEFAULT ((0)) FOR [orderPaid]

订单行项目

CREATE TABLE [dbo].[TblOrderLineItems](
    [lineID] [bigint] IDENTITY(1,1) NOT NULL,
    [orderID] [bigint] NOT NULL,
    [lineQuantity] [int] NOT NULL,
    [linePrice] [money] NOT NULL,
    [lineShippingCost] [money] NOT NULL,
    [lineTaxCost] [money] NOT NULL,
    [lineOptionCost] [money] NOT NULL,
 CONSTRAINT [PK_TblOrderLineItems] PRIMARY KEY CLUSTERED 
(
    [lineID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 50) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[TblOrderLineItems] ADD  CONSTRAINT [DF_TblOrderLineItems_lineShippingCost]  DEFAULT ((0)) FOR [lineShippingCost]
GO

ALTER TABLE [dbo].[TblOrderLineItems] ADD  CONSTRAINT [DF_TblOrderLineItems_lineTaxCost]  DEFAULT ((0)) FOR [lineTaxCost]
GO

ALTER TABLE [dbo].[TblOrderLineItems] ADD  CONSTRAINT [DF_TblOrderLineItems_lineOptionCost]  DEFAULT ((0)) FOR [lineOptionCost]
GO

订单付款

CREATE TABLE [dbo].[TblOrderPayments](
    [paymentID] [bigint] IDENTITY(1,1) NOT NULL,
    [orderID] [bigint] NOT NULL,
    [payAmount] [money] NOT NULL,
    [payPosted] [datetime] NOT NULL,
    [payValid] [bit] NOT NULL,
 CONSTRAINT [PK_TblOrderPayments] PRIMARY KEY CLUSTERED 
(
    [paymentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 50) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[TblOrderPayments] ADD  CONSTRAINT [DF_TblOrderPayments_payValid]  DEFAULT ((0)) FOR [payValid]
GO

浏览

CREATE VIEW [dbo].[vwSelectOrderLineItems] AS 
SELECT linePrice, lineShippingCost, lineTaxCost, lineOptionCost, lineQuantity 
FROM [dbo].[TblOrderLineItems]

CREATE VIEW [dbo].[vwSelectOrderPayments] AS
SELECT paymentID, orderID, payAmount, payValid
FROM dbo.TblOrderPayments

CREATE VIEW [dbo].[vwSelectOrders] AS
SELECT orderID , orderPaid
FROM dbo.TblOrders

注意

我无法更改表格结构

1 个答案:

答案 0 :(得分:1)

SELECT distinct a.orderid,
                a.orderPaid,
                c.OrderAmount
                d.Payment
From vwSelectOrders AS a
INNER JOIN ( Select SUM((linePrice + lineShippingCost + lineTaxCost + lineOptionCost) * lineQuantity) As orderAmount,OrderID
             From vwSelectOrderLineItems group by orderid) AS C on c.orderID = a.orderID
INNER JOIN (Select SUM(payAmount) as Payment,orderID FROM vwSelectOrderPayments WHERE isnull(SUM(PayAmount),0) > 0 GROUP BY OrderID) AS d ON d.orderID = a.orderID
Left Outer Join vwSelectOrderPayments b On b.orderID = a.orderID
Where b.payValid = 1 AND a.orderPaid = 0 AND 

这是一个更好的查询,因为您没有相关的子查询。相关查询是指子查询引用外部查询行的时间。这不是最佳的,因为外部查询运行的每一行都将执行相关子查询。一旦你给我们表定义,我们就可以修复查询的整体数据返回。