在MySQL中使用序列号和空格进行分组以重复值

时间:2012-12-26 00:13:00

标签: mysql sql report

我想像资源表那样创建报告

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    |

任何人都可以帮助我

1 个答案:

答案 0 :(得分:1)

以下查询可以满足您的需求。它有三个特殊功能。

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

  2. 其次,它使用@prevDocId用户变量来跟踪某个项目 仍然与前一行相同。如果是,那就是 打印'',而不是值。

  3. 最后,请注意INNER JOIN用于初始化用户的异常情况 变量为0或''。这是获得这些的诀窍 变量初始化。就是这样。

  4. 如果您想进行实验,整个过程都在http://sqlfiddle.com/#!2/99899/61

    SELECT 
      IF(t.docid=@prevDocId,'',number) as number,
      IF(t.docid=@prevDocId,'',@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