4

I don't know how to explain my problem in the title, so I'll explain it better here...

I have two tables

CREATE TABLE [dbo].[Ventas]
(
    [IdVenta] [int] IDENTITY(1,1) NOT NULL,
    [FechaVenta] [date] NULL,
    [HoraVenta] [varchar](10) NULL,
    [Subtotal] [money] NULL,
    [Iva] [money] NULL,
    [Total] [money] NULL,
    [Saldo] [money] NULL,
    [Abono] [money] NULL,
    [FormaDePago] [varchar](50) NULL,
    [Plazos] [int] NULL,
    [Estado] [varchar](50) NULL,
)

CREATE TABLE [dbo].[Plazos]
(
    [IdPlazo] [int] IDENTITY(1,1) NOT NULL,
    [IdVenta] [int] NULL,
    [NumeroPlazo] [int] NULL,
    [FechaVencimiento] [date] NULL,
    [FechaCorte] [date] NULL,
    [FechaPenalizacion] [date] NULL,
    [FechaLiquidacion] [date] NULL,
    [Total] [money] NULL,
    [Cargo] [money] NULL,
    [Abono] [money] NULL,
    [Estado] [varchar](50) NULL,
)

now to add some data

INSERT [dbo].[Ventas] ([IdVenta], [FechaVenta], [HoraVenta], [Subtotal], [Iva], [Total], [Saldo], [Abono], [FormaDePago], [Plazos], [Estado]) VALUES (182, CAST(0x54360B00 AS Date), N'11:20', 500.0000, 55.0000, 555.0000, 333.0000, 222.0000, N'A Credito', 5, N'Pendiente De Pago')
INSERT [dbo].[Ventas] ([IdVenta], [FechaVenta], [HoraVenta], [Subtotal], [Iva], [Total], [Saldo], [Abono], [FormaDePago], [Plazos], [Estado]) VALUES (183, CAST(0x54360B00 AS Date), N'12:29', 575.0000, 63.2500, 638.2500, 638.2500, 0.0000, N'Una Sola Exhibicion', 1, N'Pendiente De Pago')


INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (93, 182, 1, CAST(0x54360B00 AS Date), CAST(0x57360B00 AS Date), CAST(0x5C360B00 AS Date), CAST(0x54360B00 AS Date), 111.0000, 0.0000, 111.0000, N'Liquidado')
INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (94, 182, 2, CAST(0x73360B00 AS Date), CAST(0x75360B00 AS Date), CAST(0x7A360B00 AS Date), CAST(0x54360B00 AS Date), 111.0000, 0.0000, 111.0000, N'Liquidado')
INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (95, 182, 3, CAST(0x91360B00 AS Date), CAST(0x94360B00 AS Date), CAST(0x99360B00 AS Date), NULL, 111.0000, 111.0000, 0.0000, N'Pendiente')
INSERT [dbo].[Plazos] ([IdPlazo], [IdVenta], [NumeroPlazo], [FechaVencimiento], [FechaCorte], [FechaPenalizacion], [FechaLiquidacion], [Total], [Cargo], [Abono], [Estado]) VALUES (96, 183, 1, CAST(0x54360B00 AS Date), CAST(0x57360B00 AS Date), CAST(0x5C360B00 AS Date), NULL, 639.0000, 639.0000, 0.0000, N'Pendiente')

Foreign Key On Ventas.IdVenta = Plazos.IdVenta

Ok, Here's the deal... I need to use a query that brings data from all sales (Ventas), which only it supposed to be 2 rows...

However, I need data from Plazos, but I only need data from Plazos What I need is to display data from plazos on the same row as Ventas, but only data from the most recent Plazo...

you may notice that for example, in Plazos there is a column called NumeroPlazo which increases on the same IdVenta... what I need in this example is to display:

Ventas IdVenta 182 with data from Plazos IdPlazo 95 (since from Plazos, IdPlazo 95 has the highest number on the column Numero Plazos... and of course IdVenta 183, but since it only has one Plazo, it will display data from that plazo...

At the moment I had this query...

SELECT Ventas.*, Plazos.*, 
FROM Ventas INNER JOIN Plazos ON Plazos.IdVenta = Ventas.IdVenta 
WHERE Ventas.Estado = 'Pendiente De Pago' 
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC

but it returns 4 rows (3 rows for Venta where IdVenta = 182, and one where IdVenta = 183) What I want is only 2 rows...

Then I tried this query that worked... but only for one row

SELECT Ventas.*, Plazos.*, 
FROM Ventas INNER JOIN Plazos ON Plazos.IdVenta = Ventas.IdVenta 
WHERE Ventas.Estado = 'Pendiente De Pago' 
AND Plazos.NumeroPlazo = (SELECT MAX(Plazos.NumeroPlazo) FROM Plazos WHERE Plazos.IdVenta = 182)
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC

Obviously it only works for one sale since I specify Plazos.IdVenta = 182... My question here is... how can I use the latter query to get the data I want for each sale...

I hope yuo can help me... If you need me to be more specific, please let me know.

Thanks in advance

4

2 回答 2

2

您可以使用 CROSS APPLY,它允许您对 FROM 列表中的前面表的每一行运行一个子查询。

SELECT Ventas.*, Plazos.*
FROM Ventas
cross apply (
    select TOP(1) *
    from Plazos 
    WhERE Plazos.IdVenta = Ventas.IdVenta
    ORDER BY [NumeroPlazo] DESC) Plazos
WHERE Ventas.Estado = 'Pendiente De Pago' 
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC

通过 Row_Number() 执行此操作可能更快,但这里的子查询将要求您为内部级别的所有列设置别名,无论如何这可能不是一个坏主意。

SELECT *
FROM
(
    SELECT
        v.[IdVenta], v.[FechaVenta], v.[HoraVenta], v.[Subtotal], v.[Iva], v.[Total], v.[Saldo], v.[Abono], v.[FormaDePago], v.[Plazos], v.[Estado],
        p.[IdPlazo], p.[NumeroPlazo], p.[FechaVencimiento], p.[FechaCorte], p.[FechaPenalizacion], p.[FechaLiquidacion], p.[Total] plazostotal, p.[Cargo], p.[Abono] plazasabono, p.[Estado] plazosestado,
        RowN = ROW_NUMBER() over (partition by v.[IdVenta] order by p.[NumeroPlazo] desc)
    FROM Ventas v
    JOIN Plazos p ON p.IdVenta = v.IdVenta
    WHERE v.Estado = 'Pendiente De Pago'
) X
WHERE RowN = 1
ORDER BY FechaVenta DESC, HoraVenta DESC
于 2012-10-29T22:31:51.933 回答
0

很简单。在您的第二个问题中,替换 Ventas.IdVenta 上的 182

SELECT Ventas.*, Plazos.*
FROM Ventas INNER JOIN Plazos ON Plazos.IdVenta = Ventas.IdVenta 
WHERE Ventas.Estado = 'Pendiente De Pago' 
  AND Plazos.NumeroPlazo = (SELECT MAX(Plazos.NumeroPlazo) FROM Plazos WHERE Plazos.IdVenta = Ventas.IdVenta)
ORDER BY Ventas.FechaVenta DESC, Ventas.HoraVenta DESC
于 2012-10-30T16:10:16.520 回答