2012-12-26 30 views
1

我想这样在MySQL分组用的序列号和空白的重复值

docid|col5 | item  | qty | price | 
------------------------------------------ 
doc1 | a | item1 | 4 | 100 | 
doc1 | a | item2 | 5 | 20 | 
doc2 | a | item3 | 10 | 20 | 
doc2 | a | item4 | 11 | 20 | 

创建资源表报告中是这样

no | docid | item | qt | price | 
------------------------------------------ 
1 | doc1 | item1 | 4 | 100 | 
    |  | item2 | 5 | 20 | 
2 | doc2 | item3 | 10 | 20 | 
    |  | item4 | 11 | 20 | 

有人能帮助我

+0

“不”来自哪里?这是数据库中的列还是您希望在结果中定义的任意数字? – jbnunn

+0

我认为“不”是一个序列号。我的答案提供了一种在MySql中执行此操作的方法 – DWright

回答

1

下面的查询将做你想要的。它有三个特殊功能。

  1. 首先,它使用递增@docIdNumber用户变量 生成序号(1,2)陪(DOC1,DOC2)。这是 在MySQL中执行此操作的一种方法。

  2. 其次,它使用@prevDocId用户变量来跟踪项目 是否仍然与上一行相同。如果是,它会打印'',而不是数值。

  3. 最后,请注意不正常使用INNER JOIN将变量初始化为0或''的用户 。这是一个把这些变量初始化的技巧。就是这样。

整个事情在http://sqlfiddle.com/#!2/99899/61,如果你想实验。

SELECT 
    IF([email protected],'',number) as number, 
    IF([email protected],'',@prevDocId:=t.docid) AS docid, 
    item,qty,price 
FROM 
( 
    SELECT DISTINCT docid,item,qty,price 
    FROM theTable 
    ORDER BY docid 
) AS t 
INNER JOIN 
(
    SELECT @docIdNumber := @docIdNumber + 1 as number, docid 
    FROM 
    (
    SELECT docid 
    FROM theTable 
    GROUP BY docid 
) t 
    INNER JOIN (SELECT @docIdNumber := 0) as initializerOnly1 
) docIdNumbers ON t.docid = docIdNumbers.docid 
INNER JOIN (SELECT @prevDocId := '') as initializerOnly2