重复行 - 加入列?

时间:2013-08-16 14:00:12

标签: sql sql-server sql-server-2008

我正在尝试找到我们最畅销的产品,然后使用该信息查找其他内容。但是,我们最近将信息移动到数据库中的新表中。新表有新的项目编号,但只有一些旧的原件。当我加入旧表来获取所有内容时,它们会翻倍,因为新表的数据比旧表多。

我真的很啰嗦和混乱,所以这是一个例子:

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

(显然,这些数字是组成的)

请注意,对于Item3和Item3b,唯一的区别是ItemName和Age。其他一切都是一样的。但是因为那是不同的,我在每个领域进行分组,它将它们分成两个大多数重复的行。

有没有办法加入ItemNo和ItemNo2列?还是另一种解决这个问题的方法?

但是请注意,除了类型或年龄之外,我的每个列都是相同的。本例中的DD123在除Age之外的每个区域都是相同的,这导致它也分成两行。

其他时候,除了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

2 个答案:

答案 0 :(得分:1)

我认为您只想为新表的给定“itemNo”选择一行。您可以使用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值(基于示例中的数据)。

答案 1 :(得分: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