【问题标题】:How in query result add 0-data for don't exist rows?如何在查询结果中为不存在的行添加 0 数据?
【发布时间】:2012-10-18 07:11:38
【问题描述】:

我有包含“月”和“年”列的表格,以及其他数据。

表格中的所有行都有不同的值“月”和“年”。

但是对于某些月份和年份行不存在。

我想创建 SQL 查询(... where year in (2010, 2011, 2012) ...),结果这个 SQL 查询将所有月份用于选择年份,如果某个月份不存在其他将其添加到结果中,在其他数据列中为 0。

示例: 输入:表格

data / month / year
+-----+---+------+
| 3.0 | 1 | 2011 |
| 4.3 | 3 | 2011 |
| 5.7 | 4 | 2011 |
| 2.2 | 5 | 2011 |
| 5.4 | 7 | 2011 |
+-----+---+------+

输出:SELECT ... WHERE 年份(2011 年)

+-----+----+------+
| 3.0 |  1 | 2011 |
|   0 |  2 | 2011 |
| 4.3 |  3 | 2011 |
| 5.7 |  4 | 2011 |
| 2.2 |  5 | 2011 |
|   0 |  6 | 2011 |
| 5.4 |  7 | 2011 |
|   0 |  8 | 2011 |
|   0 |  9 | 2011 |
|   0 | 10 | 2011 |
|   0 | 11 | 2011 |
|   0 | 12 | 2011 |
+-----+----+------+

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    试试Partition Outer Join:

    SELECT
      NVL(T.DATA, 0) DATA,
      F.MONTH,
      T.YEAR
    FROM <your_table> T
    PARTITION BY(T.YEAR)
    RIGHT JOIN (SELECT LEVEL MONTH FROM DUAL CONNECT BY LEVEL <= 12) F ON T.MONTH = F.MONTH
    

    在末尾添加您的 WHERE 子句或使用该定义创建一个视图并对其进行查询。

    【讨论】:

      【解决方案2】:
      select datecol, 
             nvl(val,0),
             to_char(d.date_col,'MM') month,
             to_char(d.date_col,'yyyy') year
      from(
          select add_months('1-Jan-2011',level-1) as datecol
          from dual connect by level <= 12
           ) d
      left join(
          select sum(val) as val, month, year
          from your_table
          group by month, year
          ) S
      on (to_char(d.date_col,'MM') = s.month and to_char(d.date_col,'yyyy') = s.year)
      

      【讨论】:

        【解决方案3】:
        select nvl(t.data, 0), x.month, nvl(t.year, <your_year>) as year
          from <your_table> t,
               (select rownum as month from dual connect by level < 13) x
         where (t.year is null or t.year = <your_year>)
           and t.month(+) = x.month
         order by x.month
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-07
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2018-10-13
          • 1970-01-01
          相关资源
          最近更新 更多