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

以下のクエリは、あなたが望むことを行います。3つの特別な機能があります。

  1. まず、増加@docIdNumberするユーザー変数を使用して、(doc1,doc2) に付随するシーケンス番号 (1,2) を生成します。これは、MySQL でこれを行う 1 つの方法です。

  2. 次に、@prevDocIdユーザー変数を使用して、項目が前の行と同じかどうかを追跡します。そうであれば、値ではなく '' を出力します。

  3. 最後に、ユーザー変数を 0 または '' に初期化するための INNER JOIN の異常な使用に注意してください。これは、これらの変数を初期化するためのトリックです。それだけです。

実験したい場合は、全体が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 に答える