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

标签 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. 首先,它使用递增的@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

关于mysql - 在 MySQL 中使用序列号和空格对重复值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14034891/

相关文章:

Python 不提交 MySQL 事务

c# - MySQL 比较查询中的日语字符作为问号

php - 如何通过每个id获取最后一个数据组

c# - 基类包括字段 'report' ,但其类型 (Microsoft.Reporting.WebForms.ReportViewer) 是

Enterprise Architect 中图表 "Hyperlinks"的文档?

php - 每个用户无限项的 MySQL 数据库结构

mysql - Magento 在每次页面加载时多次发出 ALTER TABLE 命令

MySQL : How to update a table field to a value fetched from another table

SQL - 仅选择前 10 行?

xml - 什么 XSLT 将 JUnit Xml 格式转换为 JUnit Plain 格式