2017-08-28 71 views
0

2個數據表,其數據如下所示。SQL - 爲特定列或表選擇第一個匹配的行列值和任何後續行值爲空

Order表:

| OrderId | TotalAmount | TotalTax | 
|---------|-------------|----------| 
| 1 | 10  | 0.1 | 
| 2 | 40  | 0.4 | 
| 3 | 20  | 0.2 | 

項目表:(FK的OrderId)

| OrderId | ItemId | ItemDesc | 
|---------|--------|----------| 
| 1 | 1 | Item1 | 
| 1 | 2 | Item2 | 
| 2 | 1 | Item1 | 
| 2 | 3 | Item3 | 
| 2 | 5 | Item5 | 
| 3 | 7 | Item7 | 
| 3 | 5 | Item5 | 

預計輸出-Records加入兩個表應該有值,在第一行和隨後匹配的行匹配的記錄後應對於來自訂單表的列有空。如下圖所示

| OrderId | TotalAmount | TotalTax |ItemId | ItemDesc | 
|---------|-------------|----------|-------|----------| 
| 1 | 10  | 0.1 | 1 | Item1 | 
| 1 | NULL  | NULL | 2 | Item2 | 
| 2 | 40  | 0.4 | 1 | Item1 | 
| 2 | NULL  | NULL | 3 | Item3 | 
| 2 | NULL  | Null | 5 | Item5 | 
| 3 | 20  | 0.2 | 7 | Item7 | 
| 3 | NULL  | NULL | 5 | Item5 | 

查詢:

DECLARE @order table(orderId int, TotalAmount int, totaltax decimal) 
Insert into @order(orderId, TotalAmount,totaltax) 
values 
(1,10,0.1), 
(2,40,0.4), 
(3,20, 0.2) 

DECLARE @ITEMS table(OrderId int, ItemId int, ItemDesc nvarchar(50)) 
Insert into @ITEMS(OrderId, ItemId,ItemDesc) 
values 
(1,1,'Test1'), 
(1,2,'Test2'), 
(2,1,'Test1'), 
(2,3,'Test3'), 
(2,5,'Test5'), 
(3,7,'Test7'), 
(3,5,'Test5') 

select o.*,i.* from @order o 
inner join @ITEMS I 
on o.orderId = i.orderId 
+0

旁白:這看起來像顯示格式化數據,東西一般都比較好處理在應用程序中而不是在t中他數據庫。 – HABO

+0

我明白這一點。但這是一個需要這種數據的特定實例。 – Rex

回答

1

像這樣:

with q as 
(
select o.orderId, o.TotalAmount, o.totaltax, i.ItemId, i.ItemDesc, 
     case when row_number() over (partition by o.orderID order by i.ItemId) = 1 then 1 else 0 end is_first 
from @order o 
inner join @ITEMS I 
    on o.orderId = i.orderId 
) 
select orderId, 
     case when is_first = 1 then TotalAmount else null end TotalAmount, 
     case when is_first = 1 then TotalTax else null end TotalTax, 
     ItemId, 
     ItemDesc 
from q 
order by orderId, ItemId 

輸出

orderId  TotalAmount TotalTax        ItemId  ItemDesc 
----------- ----------- --------------------------------------- ----------- --------- 
1   10   0          1   Test1 
1   NULL  NULL         2   Test2 
2   40   0          1   Test1 
2   NULL  NULL         3   Test3 
2   NULL  NULL         5   Test5 
3   20   0          5   Test5 
3   NULL  NULL         7   Test7 

(7 rows affected) 
+0

@Daivd Browne - 謝謝。這工作。 – Rex

相關問題