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

(这些数字显然是编造的)

请注意,对于 Item3 和 Item3b,唯一的区别是 ItemName 和 Age。其他一切都是一样的。但因为那是不同的,我按每个字段分组,它将它们分成 2 条大部分重复的行。

有没有办法可以加入 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
4

2 回答 2

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;

这会选择任意行。如果你有办法区分这两个表(例如,在这种情况下你得到了“新”版本),那么你可以使用它。

另外,我不确定您是否想要ItemNo分区ItemNo, ItemNo2

您可以采取的另一种方法来消除 NULL 值,是按以下方式聚合itemNo

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

这将消除这些NULL值(基于示例中的数据)。

于 2013-08-16T14:09:26.753 回答
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
于 2013-08-16T14:12:44.283 回答