2

我认为这是不可能的,但我希望得到证明。

我写了一个简单的报表查看类来输出各种数据库查询的结果。为了改进显示,当我有一个包含分组数据的报告时,我想仅在每个唯一值的第一行显示字段值 - 我想在查询级别执行此操作,或者它会在我的课堂上需要额外的逻辑来确定这些特殊值。

用一个简单的例子来说明我的要求可能会有所帮助。想象一下这个数据集:

Year    Quarter    Total
2008    Q1         20
2008    Q2         25
2008    Q3         35
2008    Q4         40
2009    Q1         15
2009    Q2         20
2009    Q3         30
2009    Q4         35

如果可能,我希望数据集返回为:

Year    Quarter    Total
2008    Q1         20
        Q2         25
        Q3         35
        Q4         40
2009    Q1         15
        Q2         20
        Q3         30
        Q4         35

有没有办法在 MySQL 中以编程方式执行此操作?

4

4 回答 4

7
SELECT  CASE WHEN @r = year THEN NULL ELSE year END AS year,
        quarter,
        total,
        @r := year
FROM    (
        SELECT  @r := 0
        ) vars,
        mytable
ORDER BY
        year

@r这是一个会话变量。您可以MySQL在任何程序语言中像任何变量一样使用它们。

首先,它在子查询中被初始化为零。

其次,它在SELECT子句中被检查。如果 的当前值@r不等于year,则year输出 ,否则NULL输出。

第三,它用当前值更新year

于 2009-05-27T14:30:59.937 回答
4

你为什么想做这个?Year 列为空或 null 的现有记录怎么办?

美化输出属于报表逻辑。在伪代码中它会是某事。像:

var lastYear = 0
foreach (record in records)
{
   if (record.Year == lastYear)
   {
     print "   "
   }
   else
   {
     print record.Year
     lastYear = record.Year
   }

   // print the other columns
 }
于 2009-05-27T14:38:12.900 回答
1

不是你要求的答案,但是...

一开始在 MySQL 中做这件事听起来很可疑。仅查看原始数据行,2008 年和 2009 年第二季度的数据行似乎没有多大意义。这个问题是表象的,而不是获取数据的问题。听起来更像是要写入查看类的内容 - 例如,当传递某个参数时,它会知道不要重复“2008”之类的内容。

这还可以提高代码的可重用性:当您想要以不同的方式呈现数据时(例如按季度而不是按年份)而不是重写查询,您只需更改查看类的一个参数,以便相同的查询使用不同的 order 子句可以输出:

Quarter   Year   Total
Q1        2008   20
          2009   15
Q2        2008   25
          2009   20
...
于 2009-05-27T14:38:43.023 回答
1

它不完全符合您的要求,但我宁愿转动我的桌子。它允许直观地比较 2 年的数据,因为每列有四分之一:

SELECT Year, 
       SUM(IF(Quarter="Q1", Rev, 0)) AS Q1,
       SUM(IF(Quarter="Q2", Rev, 0)) AS Q2, 
       SUM(IF(Quarter="Q3", Rev, 0)) AS Q3, 
       SUM(IF(Quarter="Q4", Rev, 0)) AS Q4 
FROM t1 GROUP BY 1
ORDER BY 1

然后你有:

YEAR Q1   Q2   Q3   Q4
2008
2009 
于 2009-08-19T16:05:48.480 回答