简体   繁体   English

从带有案例陈述的选择中选择并合并所有

[英]Select from select with case statement and union all

When I am executing query 当我执行查询时

SELECT Settlement_Fees.Participant_Name, Settlement_Fees.Account, Settlement_Fees.Billing_Account, Settlement_Fees.Descr1, Settlement_Fees.Market, Settlement_Fees.Instrum
--, IIf(Settlement_Fees.Instr_Type='Internal','bsinternal',Settlement_Fees.Instr_Type) AS Expr1
,(case when Settlement_Fees.Instr_Type='Internal' then 'bsinternal'
  else Settlement_Fees.Instr_Type
 end )
, Settlement_Fees.Country, Settlement_Fees.Nr_Instr_Business_Unit, Settlement_Fees.Nr_Instr_Account, Settlement_Fees.Avg_EUR_Rate, Settlement_Fees.Fee_Amount_EUR, Settlement_Fees.Value_Date_Adj
FROM Settlement_Fees)
union all
 (select '','',Billing_Account,'','','',
( case when Instr_Type like '%Bridge%' or Instr_Type = '%Internal%' then 'Bszridge/Internal'
else  Instr_Type
end )
 ,'','',Nr_Instr_Account  ,'',Fee_Amount_EUR ,'' 
from Settlement_Fees group by Settlement_Fees.Billing_Account,Settlement_Fees.Instr_Type
,Settlement_Fees.Nr_Instr_Account,Fee_Amount_EUR)
union all 
(select '','',Billing_Account,'','','','Total','','',sum(Nr_Instr_Account),'',sum(Fee_Amount_EUR) ,''
from Settlement_Fees group by Billing_Account

Its is working fine 它工作正常

but when i am executin with select * from () its giving me error "Msg 102, Level 15, State 1, Line 33 Incorrect syntax near ')'." 但是,当我用select * from()执行时,它给我错误“消息102,级别15,状态1,第33行,')'附近的语法不正确”。 for the following query 对于以下查询

SELECT *
FROM  ((SELECT settlement_fees.participant_name,
               settlement_fees.ACCOUNT,
               settlement_fees.billing_account,
               settlement_fees.descr1,
               settlement_fees.market,
               settlement_fees.instrum
               --, IIf(Settlement_Fees.Instr_Type='Internal','bsinternal',Settlement_Fees.Instr_Type) AS Expr1
               ,
               ( CASE
                   WHEN settlement_fees.instr_type = 'Internal' THEN
                   'bsinternal'
                   ELSE settlement_fees.instr_type
                 END ),
               settlement_fees.country,
               settlement_fees.nr_instr_business_unit,
               settlement_fees.nr_instr_account,
               settlement_fees.avg_eur_rate,
               settlement_fees.fee_amount_eur,
               settlement_fees.value_date_adj
        FROM   settlement_fees)
       UNION ALL
       (SELECT '',
               '',
               billing_account,
               '',
               '',
               '',
               ( CASE
                   WHEN instr_type LIKE '%Bridge%'
                         OR instr_type = '%Internal%' THEN 'Bszridge/Internal'
                   ELSE instr_type
                 END ),
               '',
               '',
               nr_instr_account,
               '',
               fee_amount_eur,
               ''
        FROM   settlement_fees
        GROUP  BY settlement_fees.billing_account,
                  settlement_fees.instr_type,
                  settlement_fees.nr_instr_account,
                  fee_amount_eur)
       UNION ALL
       (SELECT '',
               '',
               billing_account,
               '',
               '',
               '',
               'Total',
               '',
               '',
               SUM(nr_instr_account),
               '',
               SUM(fee_amount_eur),
               ''
        FROM   settlement_fees
        GROUP  BY billing_account)) 

You need to give a table alias to the derived table. 您需要为派生表赋予表别名。 eg add as t to the very end of the query. 例如,在查询的末尾添加as t

Additionally to fix the issue raised in the comments change 此外,还可以解决评论更改中引发的问题

( CASE
                   WHEN settlement_fees.instr_type = 'Internal' THEN
                   'bsinternal'
                   ELSE settlement_fees.instr_type
                 END )

to

   CASE
       WHEN settlement_fees.instr_type = 'Internal' THEN
       'bsinternal'
       ELSE settlement_fees.instr_type
     END AS Foo

You shoud name your subquery: 您应该为子查询命名:

Select * from () subqueryName 选择* from()子查询

 select * from(
(SELECT Settlement_Fees.Participant_Name, Settlement_Fees.Account, Settlement_Fees.Billing_Account, Settlement_Fees.Descr1, Settlement_Fees.Market, Settlement_Fees.Instrum
--, IIf(Settlement_Fees.Instr_Type='Internal','bsinternal',Settlement_Fees.Instr_Type) AS Expr1
,(case when Settlement_Fees.Instr_Type='Internal' then 'bsinternal'
  else Settlement_Fees.Instr_Type
 end )
, Settlement_Fees.Country, Settlement_Fees.Nr_Instr_Business_Unit, Settlement_Fees.Nr_Instr_Account, Settlement_Fees.Avg_EUR_Rate, Settlement_Fees.Fee_Amount_EUR, Settlement_Fees.Value_Date_Adj
FROM Settlement_Fees)
union all
 (select '','',Billing_Account,'','','',
( case when Instr_Type like '%Bridge%' or Instr_Type = '%Internal%' then 'Bszridge/Internal'
else  Instr_Type
end )
 ,'','',Nr_Instr_Account  ,'',Fee_Amount_EUR ,'' 
from Settlement_Fees group by Settlement_Fees.Billing_Account,Settlement_Fees.Instr_Type
,Settlement_Fees.Nr_Instr_Account,Fee_Amount_EUR)
union all 
(select '','',Billing_Account,'','','','Total','','',sum(Nr_Instr_Account),'',sum(Fee_Amount_EUR) ,''
from Settlement_Fees group by Billing_Account
)) subqueryName

You have an extra set of () and aliasing your inline view/derived table also helps eg 您有一组额外的()并且对内联视图/派生表进行别名也可以帮助例如

select * from(
    SELECT 
        Settlement_Fees.Participant_Name, 
        Settlement_Fees.Account, 
        Settlement_Fees.Billing_Account, 
        Settlement_Fees.Descr1, 
        Settlement_Fees.Market, 
        Settlement_Fees.Instrum,
        (case when Settlement_Fees.Instr_Type='Internal' then 'bsinternal'
            else Settlement_Fees.Instr_Type
        end ) as SomthingHere, 
        Settlement_Fees.Country, 
        Settlement_Fees.Nr_Instr_Business_Unit, 
        Settlement_Fees.Nr_Instr_Account, 
        Settlement_Fees.Avg_EUR_Rate, 
        Settlement_Fees.Fee_Amount_EUR, 
        Settlement_Fees.Value_Date_Adj
    FROM Settlement_Fees
    UNION ALL select 
        '',
        '',
        Billing_Account,
        '',
        '',
        '',
        ( case when Instr_Type like '%Bridge%' or Instr_Type = '%Internal%' then 'Bszridge/Internal'
        else  Instr_Type
        end ),
        '',
        '',
        Nr_Instr_Account  ,
        '',
        Fee_Amount_EUR ,
        '' 
    from 
        Settlement_Fees 
    group by 
        Settlement_Fees.Billing_Account,
        Settlement_Fees.Instr_Type,
        Settlement_Fees.Nr_Instr_Account,
        Fee_Amount_EUR
    union all select 
        '',
        '',
        Billing_Account,
        '',
        '',
        '',
        'Total',
        '',
        '',
        sum(Nr_Instr_Account),
        '',
        sum(Fee_Amount_EUR) ,
        ''
    from 
        Settlement_Fees 
    group by 
        Billing_Account
) as foo

You need to give your derived table a name. 您需要给派生表命名。 Doesn't matter what. 没关系。 For example: 例如:

SELECT
   ...
FROM
   (...derived table) myDerivedTableName

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM