2016-02-22 37 views
1

我正在为客户端使用SQL Server,他们给了我一个请求。将SQL Server长列分成多个较短的列

他们有一个表products与许多列,其中之一是articleproducts中约有28,000行。

他们希望创建仅包含products的文章编号,新表articles,但设置,使新表采取article列,并将其分成3列,每列有(最多)10,000行。我解释说,这不是最好的软件,但他们坚持(他们是支付我的!)。新表具有列Article1,Artcile2Article3

有人可以帮我解决这个问题吗?

所有我已经成功至今在正确使用

insert into articles (Article1) 
    select top 10000 article 
    from products 

获得前10000名的文章编号,但现在我坚持就如何剩余值插入到第二和第三列。我知道我真正需要的是某种UPDATE查询,但我无法获得任何地方。

我运行SSMS 2014

+0

样本数据和预期结果可能有所帮助。 –

+0

像这样对数据进行非规范化的目的是什么?我认为源数据需要保持标准化(每行一篇文章),但如果强烈需要每行有三篇文章,则可以在数据之上创建一个_view_。接下来的观点是 - 如果产品有四篇文章呢? –

回答

1

如果我理解你的如果问题没有问题,则需要将article的行转换为包含3列的表格。这里是一个尝试:

;WITH Cte AS(
    SELECT article, 
     grp = (ROW_NUMBER() OVER(ORDER BY article) -1) % 
       (SELECT CEILING(COUNT(*)/(3 * 1.0)) FROM products) 
    FROM products 
), 
CteFinal AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY grp ORDER BY article) 
    FROM Cte 
) 
INSERT INTO articles(Article1, Article2, Article3) 
SELECT 
    Article1 = MAX(CASE WHEN rn = 1 THEN article END), 
    Article2 = MAX(CASE WHEN rn = 2 THEN article END), 
    Article3 = MAX(CASE WHEN rn = 3 THEN article END) 
FROM CteFinal 
GROUP BY grp 
0

您可以使用NOT EXISTS子句,在articles2表中插入时一样,你可以检查它像NOT EXISTS(SELECT ARTICLE_ID FROM ARTICLES2)。我希望你明白我的观点。

除此之外,如果您可以修改主ARTICLE表的结构,那么您可以添加名为PROCESSED的列(它将是一个布尔列,默认值为0)。在articles1表中插入数据后,您可以将PROCESSED列更新为1,然后您可以处理article2的其余文章(已处理列值= 0),然后更新处理= 1的文章,类似地文章3.如果您有任何问题,请告诉我。

+0

嘿,感谢您的快速回复!是的,我明白你的意思。 我刚刚以不同的方式解决了这个问题 - 我将第一个10,000行复制到一个表中,第二个10,000行复制到另一个表中,最后8000个复制到另一个表中,最后更新了我的'articles'表列。 – nick

0

使用表products的ID。

WITH NumberedMyTable AS 
(
    SELECT 
     Article, 
     ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber 
    FROM 
     Products 
); 

Insert INTO Articles1 
SELECT 
    Articles 
FROM 
    NumberedMyTable 
WHERE 
    RowNumber BETWEEN @From AND @To 

只需更改为3代表的@From@To

1表:@From = 1,@To = 10000

第二个表:@From = 10001,@To = 20000

第三表:@From = 20001,@To = 28000

0

哇...我喜欢听到别人怎么知道如何高效地(不)进行数据库设计,比如你被强迫的。虽然你可能有1,2,3列等给定的表,但你知道它没有意义,可以尝试以更高效的格式创建表。然后,给他们一个VIEW,以他们想要的单行格式显示文章1,2,3。只要它可以有效率,那么可能会帮助你的情况实现,但给他们他们需要的输出?

至于做这样的事情,他们可能需要最近的“x”数量的文章vs第一个,您可能需要添加一列到产品表中,指出用于给定产品的最后一个ARTICLE SEQUENCE。因此,在插入物品表格期间,通过在产品存放列中加1来获得下一个序列号。然后,插入完成后,它会更新下一篇文章的产品保留栏。

这样,一个产品可能有类似...

productid lastArticleSeq 
1   4 
2   23 
3   18 
4   27 
etc... 

您的文章表可能有...

articleid productid articleseq 
1   1   1 
2   4   1 
3   1   2 
4   3   1 
5   4   2 
...etc. 

这样,如果他们有兴趣的查询最后3篇文章,你可以使用lastArticleSeq并从中得出结论。