我不知道如何在标题中解释我的问题,所以我会在这里解释一下......
我有两张桌子
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,
)
现在添加一些数据
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')
Ventas.IdVenta上的外键= Plazos.IdVenta
好的,这是这笔交易...... 我需要使用一个带来所有销售(Ventas)数据的查询,只有它应该是2行......
但是,我需要来自Plazos的数据,但我只需要来自Plazos的数据 我需要的是显示与Ventas在同一行的plazos中的数据,但只显示来自最新Plazo的数据......
你可能会注意到,例如,在Plazos中有一个名为NumeroPlazo的列,它在相同的IdVenta上增加...在这个例子中我需要的是显示:
Ventas IdVenta 182,来自Plazos IdPlazo 95的数据(自Plazos起,IdPlazo 95在Numero Plazos栏上的数量最多...... 当然还有IdVenta 183,但由于它只有一个Plazo,它会显示来自该平台的数据......
目前我有这个问题......
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
但它返回4行(Venta为3行,IdVenta = 182,其中IdVenta = 183) 我想要的只有两排......
然后我尝试了这个有效的查询......但只有一行
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
显然它只适用于一次销售,因为我指定Plazos.IdVenta = 182 ...... 我的问题是......如何使用后一种查询来获取每次销售所需的数据......
我希望你能帮助我...... 如果您需要我更具体,请告诉我。
提前致谢
答案 0 :(得分: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
答案 1 :(得分: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