Столбец "DEV_EIMDW_BOJ_REPORTS.dbo.bojdeposit_tab.CUSTOMER_ID" недопустим в списке выбора - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь выполнить вставку, используя процедуру, которая создает таблицу и заполняет ее.Ошибка: столбец DEV_EIMDW_BOJ_REPORTS.dbo.bojdeposit_tab.CUSTOMER_ID 'недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

INSERT INTO 
  dbo.PortfolioTable(custIdTrn,portfolioValue,scheme_type,jmdvalue,jmdeq,usdeq,usdvalue,cadvalue,gbpvalue,eurvalue,usdoth) 
  select trn,portfolio_size, scheme_type, sum(jmdval), sum(jmdeq),sum(usdeq),
  sum(usdvalue), sum(cadvalue), sum(gbpvalue), sum(eurvalue),sum(usdoth) 
  from 
    (  SELECT
      CASE WHEN b.trn IS NULL THEN  b.customer_id ELSE b.trn END AS trn,
      p.portfolio_size,
      b.scheme_type,
      case currency when 'JMD' then  transaction_balance  else 0 end jmdval, 
      case currency when 'JMD' then 0 else dbo.FN_ConvertAmountAsOfDate(@asAtDate, currency,'JMD',transaction_balance,'REV') end jmdeq,
      case currency  when 'JMD' then 0 else dbo.FN_ConvertAmountAsOfDate(@asAtDate, currency,'USD',transaction_balance,'REV') end usdeq,
      case currency when 'USD' then transaction_balance else 0 end usdvalue ,
      case currency when 'CAD' then transaction_balance else 0 end cadvalue ,
      case currency when 'GBP' then transaction_balance else 0 end gbpvalue ,       
      case currency when 'EUR' then transaction_balance else 0 end eurvalue ,       
      case currency  when 'JMD' then 0 when 'USD' then 0 when 'CAD' then 0 when 'GBP' then 0 when 'EUR' then 0 
       else dbo.FN_ConvertAmountAsOfDate(@asAtDate, currency,'USD',transaction_balance,'REV') end usdoth 
      FROM
      [DEV_EIMDW_BOJ_REPORTS].[dbo].[bojdeposit_tab] b
      INNER JOIN
      [DEV_EIMDW_BOJ_REPORTS].[dbo].[BOJ_DEPOSIT_PORTFOLIO] p
      ON
      b.customer_id = p.cust_id
      WHERE
      NOT EXISTS  (SELECT 1 FROM boj_deposits_exclusion e where e.acid  = b.acid)
      AND borrower_category_code IN (SELECT VALUE FROM string_split((SELECT borrowercat_code FROM M11_CATEGORY WHERE description = 'BUSFIRMS'),','))
      AND sector_code IN (SELECT VALUE FROM string_split((SELECT sector_code FROM M11_CATEGORY WHERE description = 'BUSFIRMS'),','))
      AND sub_sector_code IN (SELECT VALUE FROM string_split((SELECT sub_sector_code FROM M11_CATEGORY WHERE description = 'BUSFIRMS'),','))
      AND not EXISTS (SELECT acid from [DEV_EIMDW_Archive].[ARCHOWN].[FINCL_ALR] WHERE acct_label  IN ('MUNDO', 'BOJCAMBIO', 'VOSTROACCT') AND acid = b.acid)
      AND b.borrower_category_code != '500'
      group by trn,portfolio_size, scheme_type
      ) AS Portfolio

1 Ответ

0 голосов
/ 25 февраля 2019

Все столбцы, которые не участвуют в агрегациях, должны быть указаны в предложении GROUP BY.На самом деле исходный запрос имеет правильный GROUP BY, но он был помещен в неправильную строку и должен быть перемещен наружу.

Скорректированный запрос:

INSERT INTO 
dbo.PortfolioTable(custIdTrn,portfolioValue,scheme_type,jmdvalue,jmdeq,usdeq,usdvalue,cadvalue,gbpvalue,eurvalue,usdoth) 
select trn,portfolio_size, scheme_type, sum(jmdval), sum(jmdeq),sum(usdeq),
sum(usdvalue), sum(cadvalue), sum(gbpvalue), sum(eurvalue),sum(usdoth) 
from 
(  SELECT
    CASE WHEN b.trn IS NULL THEN  b.customer_id ELSE b.trn END AS trn,
    p.portfolio_size,
    b.scheme_type,
    case currency when 'JMD' then  transaction_balance  else 0 end jmdval, 
    case currency when 'JMD' then 0 else dbo.FN_ConvertAmountAsOfDate(@asAtDate, currency,'JMD',transaction_balance,'REV') end jmdeq,
    case currency  when 'JMD' then 0 else dbo.FN_ConvertAmountAsOfDate(@asAtDate, currency,'USD',transaction_balance,'REV') end usdeq,
    case currency when 'USD' then transaction_balance else 0 end usdvalue ,
    case currency when 'CAD' then transaction_balance else 0 end cadvalue ,
    case currency when 'GBP' then transaction_balance else 0 end gbpvalue ,       
    case currency when 'EUR' then transaction_balance else 0 end eurvalue ,       
    case currency  when 'JMD' then 0 when 'USD' then 0 when 'CAD' then 0 when 'GBP' then 0 when 'EUR' then 0 
    else dbo.FN_ConvertAmountAsOfDate(@asAtDate, currency,'USD',transaction_balance,'REV') end usdoth 
    FROM
    [DEV_EIMDW_BOJ_REPORTS].[dbo].[bojdeposit_tab] b
    INNER JOIN
    [DEV_EIMDW_BOJ_REPORTS].[dbo].[BOJ_DEPOSIT_PORTFOLIO] p
    ON
    b.customer_id = p.cust_id
    WHERE
    NOT EXISTS  (SELECT 1 FROM boj_deposits_exclusion e where e.acid  = b.acid)
    AND borrower_category_code IN (SELECT VALUE FROM string_split((SELECT borrowercat_code FROM M11_CATEGORY WHERE description = 'BUSFIRMS'),','))
    AND sector_code IN (SELECT VALUE FROM string_split((SELECT sector_code FROM M11_CATEGORY WHERE description = 'BUSFIRMS'),','))
    AND sub_sector_code IN (SELECT VALUE FROM string_split((SELECT sub_sector_code FROM M11_CATEGORY WHERE description = 'BUSFIRMS'),','))
    AND not EXISTS (SELECT acid from [DEV_EIMDW_Archive].[ARCHOWN].[FINCL_ALR] WHERE acct_label  IN ('MUNDO', 'BOJCAMBIO', 'VOSTROACCT') AND acid = b.acid)
    AND b.borrower_category_code != '500'
   -- the line below was commented out, because it should be stated outside!
   -- group by trn,portfolio_size, scheme_type
) AS Portfolio
-- Moved outside from the inner query:
GROUP BY trn,portfolio_size, scheme_type
...