1

我想像这样从资源表创建报告

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    |

任何人都可以帮助我

4

1 回答 1

1

下面的查询将执行您想要的操作。它具有三个特殊功能。

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

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

  3. 最后,请注意不寻常地使用 INNER JOIN 将用户变量初始化为 0 或 ''。这是初始化这些变量的技巧。这就是它所做的一切。

如果您想进行实验,整个事情都在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
于 2012-12-26T01:52:28.163 回答