¿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/

Preguntas similare

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/




Respuesta Responder a este mensaje
#2 J.A. García Barceló
27/06/2006 - 09:08 | Informe spam
Exacto. Muchas gracias.

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


"Alejandro Mesa" escribió en el
mensaje news:
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/




email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida