sql db2-如何使用“select”添加/创建行

sql db2-如何使用“select”添加/创建行,select,db2,row,dql,Select,Db2,Row,Dql,我的查询提取如下数据: BSYY CCF 2001 .5 2003 .8 2007 .9 我想为CCF值不存在的年份创建值“0”,因此它看起来像: BSYY CCF 2001 .5 2002 0 2003 .8 2004 0 2005 0 2006 0 2007 .9 问题是,我没有“创建”或“插入”的权限。。。有没有不创建临时表的方法呢?您当然可以使用SQL来实现这一点,特别是如果您有一个可以提供所有年份的表的话。下面是一个示例,演示如何通过生成表来执行此操作: w

我的查询提取如下数据:

BSYY  CCF
2001  .5
2003  .8
2007  .9
我想为CCF值不存在的年份创建值“0”,因此它看起来像:

BSYY  CCF
2001  .5
2002  0
2003  .8
2004  0
2005  0
2006  0
2007  .9

问题是,我没有“创建”或“插入”的权限。。。有没有不创建临时表的方法呢?

您当然可以使用SQL来实现这一点,特别是如果您有一个可以提供所有年份的表的话。下面是一个示例,演示如何通过生成表来执行此操作:

with
   t (bsyy, ccf) as (values (2001, 0.5),(2003,0.8),(2007,0.9))
  ,y (year) as (values (2000),(2001),(2002),(2003),(2004),
                       (2005),(2006),(2007),(2008),(2009))
select
   y.year
  ,coalesce(t.ccf,0.0) as ccf
from
   y
   left outer join t on y.year = t.bsyy
order by
   y.year;
您将用实际的源表替换t公共表表达式。例如,如果您有一个名为tab1的表,其中包含bsyy和ccf列,则查询将是:

with
   y (year) as (values (2000),(2001),(2002),(2003),(2004),
                       (2005),(2006),(2007),(2008),(2009))
select
   y.year
  ,coalesce(t.ccf,0.0) as ccf
from
   y
   left outer join tab1 t 
      on y.year = t.bsyy
order by
   y.year;
您可以使用递归表达式为您生成这些值,而不是硬编码y公共表表达式的值


但是,为什么要强制DBMS这样做呢?为什么不在应用程序级别执行此操作?

您需要的年份范围有多大?@mustaccio它从2001年到2010年谢谢!但是,我有一个问题。。实际上,我的表有5列BSYY、CCF、CLIENT_TYPE、PRODUCT_SEGMENT、PRODUCT_COUNT,要手动将所有值输入到表“t”中,需要花费很长时间,如您在回答中所述。对不起,我应该在原来的问题中说明这一点。有没有一种方法可以做到这一点,而不必输入表“t”的每个结果值?我强迫DBMS这样做,而不是应用程序,因为这种类型的表大约有40个,我想知道,如果不在Excel中组织数据,我是否可以这样拉取数据,这样我就不必在Excel中编辑它。我可以用Excel中的if&vlookup语句制作一个模板,但我想知道是否可以直接从DBMS中提取这种格式的数据。。节省一步@user2810030正如我在回答中提到的,您可以用正在查询的实际表替换t公共表表达式。在我上面的代码中,t只是用来保存示例数据。对不起,如果不指定值,第一行的语法是什么?@user2810030用第二个示例更新了答案。