Je suppose que cette requête doit être insérée dans un rapport, c'est pourquoi vous ne voulez qu'une seule fois le coût total d'expédition, alors que vous n'avez pas besoin de table temporaire pour cette référence, vous pouvez toujours:
DECLARE @tmp TABLE
(
srno int identity (1,1) ,
orderid int,
orderdate datetime,
product_code varchar(255),
product_name varchar(255),
shipping_cost decimal(18,2)
)
et utiliser @tmp plutôt que #tmp
Mais vous ne devriez pas avoir besoin d'un voir pour cela, table temporaire ci-dessous:
SELECT ord.orderid, ord.orderdate, odn.productcode, odn.productname, ord.totalshippingcost
FROM OrderNew AS ord
INNER JOIN order_detailsnew AS odn ON odn.orderid = ord.orderid
WHERE odn.productcode = (SELECT MIN(productcode) FROM OrderNew AS odn2 WHERE odn2.orderid = ord.orderid)
UNION ALL
SELECT ord.orderid, ord.orderdate, odn.productcode, odn.productname, 0.0 AS totalshippingcost
FROM OrderNew AS ord
INNER JOIN order_detailsnew AS odn ON odn.orderid = ord.orderid
WHERE odn.productcode > (SELECT MIN(productcode) FROM OrderNew AS odn2 WHERE odn2.orderid = ord.orderid)
ORDER BY ord.orderid, ord.orderdate, odn.productcode
fonctionne bien pour moi avec le foll script de test en raison:
DECLARE @ord TABLE
(
orderid int,
orderdate datetime,
totalshippingcost decimal(18,2)
)
DECLARE @odn TABLE
(
orderid int,
productcode varchar(255),
productname varchar(255)
)
INSERT INTO @ord VALUES(1, CAST('20110101' AS DATETIME), 50.25)
INSERT INTO @ord VALUES(2, CAST('20110105' AS DATETIME), 78.15)
INSERT INTO @ord VALUES(3, CAST('20110112' AS DATETIME), 65.50)
INSERT INTO @ord VALUES(4, CAST('20110112' AS DATETIME), 128.00)
INSERT INTO @odn VALUES(1, 'aa', 'AAA')
INSERT INTO @odn VALUES(1, 'bb', 'BBB')
INSERT INTO @odn VALUES(1, 'cc', 'CCC')
INSERT INTO @odn VALUES(2, 'aa', 'AAA')
INSERT INTO @odn VALUES(2, 'bb', 'BBB')
INSERT INTO @odn VALUES(3, 'bb', 'BBB')
INSERT INTO @odn VALUES(3, 'cc', 'CCC')
INSERT INTO @odn VALUES(4, 'cc', 'CCC')
Et mes résultats:
Result Set (8 items)
orderid | orderdate | productcode | productname | totalshippingcost
1 | 01/01/2011 00:00:00 | aa | AAA | 50.25
1 | 01/01/2011 00:00:00 | bb | BBB | 0.00
1 | 01/01/2011 00:00:00 | cc | CCC | 0.00
2 | 05/01/2011 00:00:00 | aa | AAA | 78.15
2 | 05/01/2011 00:00:00 | bb | BBB | 0.00
3 | 12/01/2011 00:00:00 | bb | BBB | 65.50
3 | 12/01/2011 00:00:00 | cc | CCC | 0.00
4 | 12/01/2011 00:00:00 | cc | CCC | 128.00
edit: je ne suis pas satisfait de la solution ci-dessus, voici une UCH façon plus rapide et plus élégante de le faire:
SELECT ord.orderid, ord.orderdate, ord.productcode, ord.productname, CASE WHEN row_no = 1 THEN ord.totalshippingcost ELSE 0.0 END AS totalshippingcost
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY ord.orderid ORDER BY ord.orderid, ord.orderdate, odn.productcode) AS row_no, ord.orderid, ord.orderdate, odn.productcode, odn.productname, ord.totalshippingcost
FROM OrderNew AS ord
INNER JOIN order_detailsnew AS odn ON odn.orderid = ord.orderid
) ord
ORDER BY ord.orderid, ord.orderdate, ord.productcode
Les résultats correspondent parfaitement.
Modifier pour user580950, pour insérer des valeurs nulles dans chaque seconde rangée:
Vous modifiez la première ligne SELECT être:
SELECT CASE D.N WHEN 1 THEN ord.orderid END AS orderid, ...
Et vous chance ORDER BY ligne être:
CROSS JOIN (SELECT 1 UNION ALL SELECT 2) AS D(N)
ORDER BY ord.orderid, ord.orderdate, ord.productcode, D.N
Mais comme les commentaires disent dans votre autre question SQL Query Add an Alternate Blank Records, c'est quelque chose que vous devriez faire à votre couche de présentation et non dans la base de données.
Qu'essayez-vous de faire. Pouvez-vous expliquer votre configuration et votre objectif db? – Dave