¿Como hacer esto compatible con SQL 2000, sin ROW_ORDER()?

26/06/2006 - 18:30 por J.A. García Barceló | Informe spam
Tengo las siguientes tablas:

CREATE TABLE [dbo].[Orders](
[OrderId] [int] NOT NULL,
[Description] [nchar](10) COLLATE Modern_Spanish_CI_AS NULL,
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[OrdersItems](
[OrderId] [int] NOT NULL,
[ItemId] [int] NOT NULL,
[Description] [nchar](10) COLLATE Modern_Spanish_CI_AS NULL,
[ReadyToDeliver] [bit] NOT NULL CONSTRAINT [DF_OrdersItems_ReadyToDeliver]
DEFAULT ((0)),
CONSTRAINT [PK_OrdersItems] PRIMARY KEY CLUSTERED
(
[OrderId] ASC,
[ItemId] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


INSERT INTO Orders (OrderId, Description) VALUES (1, 'Pedido1')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 1, 'item
1')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 2, 'item
2')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 3, 'item
3')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 4, 'item
4')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 5, 'item
5')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 6, 'item
6')
INSERT INTO Orders (OrderId, Description) VALUES (2, 'Pedido2')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (2, 1, 'item
1')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (2, 2, 'item
2')

Según avanzan los pedidos, algunos items se terminan y pueden ser enviados:

UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=1 AND ItemId=3
UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=1 AND ItemId=4
UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=1 AND ItemId=6
UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=2 AND ItemId=2

Y llega el momento de hacer albaranes parciales para lo que ya está listo
para salir:

SELECT OrderId, ROW_NUMBER() OVER (ORDER BY ItemId) AS Codigo, ItemId,
Description FROM OrdersItems WHERE ReadyToDeliver = 1

Resultados:
OrderId Codigo ItemId Description
1 1 3 item 3
1 2 4 item 4
1 3 6 item 6
2 4 2 item 2

Si os fijais, la nueva columna 'Codigo', empieza en 1 y acaba en 4.
Realmente esto tampoco es lo que quiero hacer. Los resultados que realmente
me interesa obtener son los siguientes:

OrderId Codigo ItemId Description
1 1 3 item 3
1 2 4 item 4
1 3 6 item 6
2 1 2 item 2

Quiero que cada 'Codigo' empiece de nuevo en 1 para cada nuevo OrderId. Esto
no se consigue usando ROW_NUMBER() (que además tampoco se puede usar en un
SQL Server 2000), pero es algo parecido.

Alguna idea? Muchas gracias de antemano.


J.A. García Barceló
http://jagbarcelo.blogspot.com/
 

Leer las respuestas

#1 Alejandro Mesa
26/06/2006 - 19:34 | Informe spam
Trata:

select
a.OrderId,
count(*) as Codigo,
a.ItemId,
a.[Description]
from
dbo.[OrdersItems] as a
inner join
dbo.[OrdersItems] as b
on a.OrderId = b.OrderId
and a.ItemId >= b.ItemId
where
a.ReadyToDeliver = 1
and b.ReadyToDeliver = 1
group by
a.OrderId,
a.ItemId,
a.[Description]
order by
a.OrderId,
Codigo
go


AMB


"J.A. García Barceló" wrote:

Tengo las siguientes tablas:

CREATE TABLE [dbo].[Orders](
[OrderId] [int] NOT NULL,
[Description] [nchar](10) COLLATE Modern_Spanish_CI_AS NULL,
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[OrderId] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[OrdersItems](
[OrderId] [int] NOT NULL,
[ItemId] [int] NOT NULL,
[Description] [nchar](10) COLLATE Modern_Spanish_CI_AS NULL,
[ReadyToDeliver] [bit] NOT NULL CONSTRAINT [DF_OrdersItems_ReadyToDeliver]
DEFAULT ((0)),
CONSTRAINT [PK_OrdersItems] PRIMARY KEY CLUSTERED
(
[OrderId] ASC,
[ItemId] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


INSERT INTO Orders (OrderId, Description) VALUES (1, 'Pedido1')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 1, 'item
1')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 2, 'item
2')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 3, 'item
3')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 4, 'item
4')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 5, 'item
5')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (1, 6, 'item
6')
INSERT INTO Orders (OrderId, Description) VALUES (2, 'Pedido2')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (2, 1, 'item
1')
INSERT INTO OrdersItems (OrderId, ItemId, Description) VALUES (2, 2, 'item
2')

Según avanzan los pedidos, algunos items se terminan y pueden ser enviados:

UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=1 AND ItemId=3
UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=1 AND ItemId=4
UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=1 AND ItemId=6
UPDATE OrdersItems SET ReadyToDeliver = 1 WHERE OrderId=2 AND ItemId=2

Y llega el momento de hacer albaranes parciales para lo que ya está listo
para salir:

SELECT OrderId, ROW_NUMBER() OVER (ORDER BY ItemId) AS Codigo, ItemId,
Description FROM OrdersItems WHERE ReadyToDeliver = 1

Resultados:
OrderId Codigo ItemId Description
1 1 3 item 3
1 2 4 item 4
1 3 6 item 6
2 4 2 item 2

Si os fijais, la nueva columna 'Codigo', empieza en 1 y acaba en 4.
Realmente esto tampoco es lo que quiero hacer. Los resultados que realmente
me interesa obtener son los siguientes:

OrderId Codigo ItemId Description
1 1 3 item 3
1 2 4 item 4
1 3 6 item 6
2 1 2 item 2

Quiero que cada 'Codigo' empiece de nuevo en 1 para cada nuevo OrderId. Esto
no se consigue usando ROW_NUMBER() (que además tampoco se puede usar en un
SQL Server 2000), pero es algo parecido.

Alguna idea? Muchas gracias de antemano.


J.A. García Barceló
http://jagbarcelo.blogspot.com/




Preguntas similares