我正在尝试找到我们最畅销的产品,然后使用该信息查找其他内容。但是,我们最近将信息移动到数据库中的新表中。新表有新的项目编号,但只有一些旧的原件。当我加入旧表来获取所有内容时,它们会翻倍,因为新表的数据比旧表多。
我真的很啰嗦和混乱,所以这是一个例子:
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
答案 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;
这会选择任意一行。如果您有办法区分这两个表(例如,在这种情况下您获得“新”版本),那么您可以使用它。
此外,我不确定您是否需要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
值(基于示例中的数据)。
答案 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