1

我不知道标题是否有意义,或者这是否与 sql 或 tsql 有关,因为我对 sql 相对较新并且来自 vba 背景,但以下是我所拥有的一半(我修改了它,但是 BI 包sql reader创建了基本的select/from/where's ..它似乎使用where而不是join)。如果它有助于理解,我用它来填充一个 olap 多维数据集。所以有 1 个值被读取,并且还需要大量相关字段。

我已经设法从这里学到了一些东西(因此我认为它可能是 tsql),但我坚持这个。

我得到的值 *dbo.gl_acct_detail.db_amt_cc - dbo.gl_acct_detail.cr_amt_cc* 这与一个月(表格 accouting_period)、org_code、acc_code 和 mkt_segment 相关联

mkt_segment 来自 prj_phase 表,该表通过 prj_code 和 phase_code “加入”到 acct_detail 表。问题是对于某些 acct_code 没有 prj_code 或 Phase_code..它们是空的..所以不能链接到 prj_phase 表,所以没有 mkt_segment。在这种情况下,我想使用硬编码/默认值代替 mkt_segment 值(无法获得)。我尝试在 select 语句中为 mkt_segment 使用 Case When,但这不起作用。

我可以在单独的查询中执行此操作(通过排除 prj_phase 表,并在 select 语句中对值进行硬编码并将 dbo.acct_code.phase_code 为 null 的位置)..但我想知道如何在其中执行此操作询问。

SELECT 
    CASE WHEN substring(cast(dbo.gl_acct_detail.accounting_period as CHAR), 5, 2) < '07' 
           THEN Left(dbo.gl_acct_detail.accounting_period, 6)  - 94 
           ELSE Left(dbo.gl_acct_detail.accounting_period, 6) - 6 
    end,  
    dbo.gl_acct_detail.org_code, 
    dbo.gl_acct_detail.acct_code, 
    dbo.prj_phase.mkt_segment, 
    CASE WHEN (dbo.gl_acct_detail.fiscal_per_nbr <> '12' and dbo.gl_acct_detail.acct_code = '70199') 
           THEN '0' 
           ELSE dbo.gl_acct_detail.db_amt_cc - dbo.gl_acct_detail.cr_amt_cc 
    end
FROM 
    dbo.gl_acct_detail, dbo.sys_defaults, dbo.prj_phase
WHERE 
    dbo.gl_acct_detail.fiscal_year = dbo.sys_defaults.current_fiscal_year -1
    AND dbo.gl_acct_detail.phase_code = dbo.prj_phase.phase_code
    AND dbo.gl_acct_detail.prj_code = dbo.prj_phase.prj_code

任何有关调查内容的帮助/建议将不胜感激!

4

2 回答 2

1

试试这个 :

SELECT 
    CASE WHEN substring(cast(dbo.gl_acct_detail.accounting_period as CHAR), 5, 2) < '07' 
           THEN Left(dbo.gl_acct_detail.accounting_period, 6)  - 94 
           ELSE Left(dbo.gl_acct_detail.accounting_period, 6) - 6 
    end,  
    dbo.gl_acct_detail.org_code, 

    dbo.gl_acct_detail.acct_code
    , 
    case
    when (dbo.gl_acct_detail.phase_code is null or dbo.gl_acct_detail.prj_code is null)
                  then 'default value'
      else dbo.prj_phase.mkt_segment
      end mkt_segment, 
    CASE WHEN (dbo.gl_acct_detail.fiscal_per_nbr <> '12' and dbo.gl_acct_detail.acct_code = '70199') 
           THEN '0' 
           ELSE dbo.gl_acct_detail.db_amt_cc - dbo.gl_acct_detail.cr_amt_cc 
    end
FROM 
    dbo.gl_acct_detail
    left join 
    dbo.sys_defaults on dbo.gl_acct_detail.fiscal_year = dbo.sys_defaults.current_fiscal_year -1

    left join  
    dbo.prj_phase on dbo.gl_acct_detail.phase_code = dbo.prj_phase.phase_code
                    AND dbo.gl_acct_detail.prj_code = dbo.prj_phase.prj_code
于 2013-07-31T05:35:23.117 回答
0

您首先需要将您的语句更新为其他表的用户 Inner Join 关键字。

对于您的情况,您不能对 dbo.prj_phase 表使用外部联接,因为联接列为空,该行根本不会被拾取。请参阅MSDN 链接到 Sql Join

在这种情况下,您可以做的是创建一个子查询并让它返回空值,然后您就可以获取该数据。

于 2013-07-31T05:39:56.797 回答