2013-08-16 35 views
0

我試圖找到我們最暢銷的產品,然後使用該信息來查找其他內容。但是,我們最近將信息移到了我們數據庫中的新表中。新表格有新的項目編號,但只有一些舊的原件。當我加入舊錶獲取所有內容時,他們會倍增很多,因爲新表的數據比舊數據多。重複行 - 加入列?

我真的很羅嗦,因此這裏混亂是一個例子:

ItemName ItemNo ItemNo2 Size Age  Type   Count Sales  YearNew 
Item1  AA123  AA123  ST  NULL Accessories 1234 12334.56 2008 
Item2  BB123  BB123  ST  Adult Accessories 5643 98765.43 2006 
Item3  CC123  CC123  ST  NULL Accessories 1111 11111.11 2007 
Item3b  CC123  CC123  ST  Adult Accessories 1111 11111.11 2007 
Item4  DD123  DD123  L  Kids Costumes  333 7891.12 2011 
Item4  DD123  DD123  L  Teen Costumes  333 7891.12 2011 

(這些數字是由,很明顯)

注意,對於項目3和Item3b唯一的區別是ITEMNAME和年齡。其他一切都是一樣的。但是因爲這是不同的,我正在按照每個領域進行分組,所以它們將它們分成2個大部分重複的行。

有沒有一種方法可以加入ItemNo和ItemNo2列?或解決這個問題的另一種方法?

但也請注意,我有情況,每一列是相同的,除了類型或年齡。在這個例子中,除了年齡,DD123在每個區域都是相同的,這也導致它分成兩行。

其他時間,除了ItemName外,其他時間都是一樣的。它各不相同。

有人向我建議,我要求編程只是將他們遺漏回來的舊項目編號添加到新表格中。這是最好的方法,還是我能做的事情?

我有對數據庫的只讀訪問所以我不能自己做任何更改。

爲了好玩,這裏是我使用的時刻查詢:

select PM.ProductMasterName as ItemName,PM.ItemNumber as ItemNo, 
    op.ItemNumber_obsolete as ItemNo2, 
    OP.Size_obsolete as Size,Age.AgeSegment as Age, 
    PT.ProductTypeDescription as Type,PM.Price, 
    COUNT(PM.ItemNumber) as 'Count', 
    (PM.Price*COUNT(PM.ItemNumber)) as Sales, 
    YEAR(PS.DateCreated) as YearNew 
from dbo.tblOrder O with (nolock) 
    left outer join dbo.tblOrderProduct OP with (nolock) 
     on O.OrderID=op.OrderID 
    left outer join dbo.tblProductSize PS 
     on OP.ItemNumber_obsolete=PS.ItemNumber_obsolete 
      and OP.Size_obsolete=PS.Size_obsolete 
    left outer join Product.ProductMaster PM with (nolock) 
     on PM.ItemNumber=OP.ItemNumber_obsolete 
      and PM.Price=OP.Price 
    left outer join Product.ProductType PT 
     on PM.ProductTypeID=PT.ProductTypeID 
    left outer join Product.AgeSegmentToProductMaster ASPM 
     on PM.ProductMasterID=ASPM.ProductMasterID 
    left outer join Product.AgeSegment Age 
     on ASPM.AgeSegmentID=Age.AgeSegmentID 
where O.OrderDate >= '2012-01-01' 
    and O.OrderDate < '2013-01-01' 
group by PM.ProductMasterName,PM.ItemNumber,op.ItemNumber_obsolete, 
    OP.Size_obsolete,PM.Price,Age.AgeSegment, 
    PT.ProductTypeDescription,YEAR(PS.DateCreated) 
order by Sales desc 
+0

我希望你明白,如果一塊數據不同,它應該是結果集中的一個單獨的行,這就是SQL按設計工作的方式。你沒有記錄。 – HLGEM

回答

1

我想你只需要選擇一個行對於給定的「產品編號」爲新表。您可以使用row_number()

select t.* 
from (select t.*, 
      row_number() over (partition by itemNo order by (select NULL)) as seqnum 
     from newt t 
    ) t 
where seqnum = 1; 

這會選擇任意行。如果你有一種區分兩個表的方法(例如,在這種情況下你會得到「新」版本),那麼你可以使用它。

此外,我不確定您是否想爲分區使用ItemNoItemNo, ItemNo2

可以採取另一種方法,以消除NULL值,是通過itemNo聚集:

select ItemNo, max(ItemName) as ItemName, max(size) as size, max(age) as age, . . . 
from newT 
group by ItemNo; 

這將消除NULL值(基於該示例中的數據)。

+0

好的解決方案,忘記了這種技術。 –

0
-- Creating temp repository to hold test data. 
CREATE TABLE #T (Id int IDENTITY(1,1), ItemName VARCHAR(20), ItemNo VARCHAR(20), ItemNo2 VARCHAR(20), Size VARCHAR(20), Age VARCHAR(20), [Type] VARCHAR(20), [Count] VARCHAR(20), Sales VARCHAR(20), YearNew VARCHAR(20)) 

INSERT INTO #T (ItemName, ItemNo, ItemNo2, Size, Age, [Type], [Count], Sales, YearNew ) 
SELECT 'Item1','AA123','AA123','ST','NULL','Accessories','1234','12334.56','2008' UNION 
SELECT 'Item2','BB123','BB123','ST','Adult','Accessories','5643','98765.43','2006' UNION 
SELECT 'Item3','CC123','CC123','ST','NULL','Accessories','1111','11111.11','2007' UNION 
SELECT 'Item3b','CC123','CC123','ST','Adult','Accessories','1111','11111.11','2007' UNION 
SELECT 'Item4','DD123','DD123','L','Kids','Costumes','333','7891.12','2011' UNION 
SELECT 'Item4','DD123','DD123','L','Teen','Costumes','333','7891.12','2011' 

-- Use last records data when there are dupliate ItemNo values 
SELECT T.* 
FROM #T T 
JOIN 
(
    SELECT ItemNo, Id = MAX(Id) 
    FROM #T 
    GROUP BY ItemNo 
) X ON X.Id = T.Id