ORACLE SQL将多行合并为一行并对字段求和
ORACLE SQL。。。我尝试将共享以下字段中相同内容的行合并为一行:ORACLE SQL将多行合并为一行并对字段求和,sql,oracle,Sql,Oracle,ORACLE SQL。。。我尝试将共享以下字段中相同内容的行合并为一行: ENTITY_UNIQUE_IDENTIFIER ACCOUNT_NUMBER AB_CODE_B ACCOUNT_DESCRIPTION ACCOUNT_TYPE **AND** when FINANCIAL_STATEMENT = 'A' 此外,我需要将所有前一行中的字段GL_ACCOUNT_BALANCE的总和相加到这一新行中 我已经编写了以下代码 Select ab.company ENTITY_UNIQU
ENTITY_UNIQUE_IDENTIFIER
ACCOUNT_NUMBER
AB_CODE_B
ACCOUNT_DESCRIPTION
ACCOUNT_TYPE
**AND** when FINANCIAL_STATEMENT = 'A'
此外,我需要将所有前一行中的字段GL_ACCOUNT_BALANCE的总和相加到这一新行中
我已经编写了以下代码
Select ab.company ENTITY_UNIQUE_IDENTIFIER,ab.account ACCOUNT_NUMBER,
CASE
When Substr(ab.account,1,1) in ('1','2','3') or Substr(ab.account,1,4) = '9999' Then ''
When Substr(ab.account,1,1) NOT in ('1','2','3') or Substr(ab.account,1,4) != '9999' Then ab.CODE_B
End ab_CODE_B,
CASE
When Substr(ab.account,1,1) in ('1','2','3') or Substr(ab.account,1,4) = '9999' Then ''
When Substr(ab.account,1,1) NOT in ('1','2','3') or Substr(ab.account,1,4) != '9999' Then ab.CODE_B_DESC
End ab_CODE_B,
' ' KEY_5,
' ' KEY_6,
' ' KEY_7,
' ' KEY_8,
' ' KEY_9,
' ' KEY_10,
a.description ACCOUNT_DESCRIPTION,
' ' ACCOUNT_REFERENCE,
Case
When Substr(ab.account,1,1) in ('1','2','3') or Substr(ab.account,1,4) = '9999' Then 'A'
Else 'I'
End FINANCIAL_STATEMENT,----
Case
When (ab.account_type = 'ASSETS' or ab.account_type = 'ASSETS1' or ab.account_type = 'ASSETS2'
or ab.account_type = 'ASSETS3') Then 'Asset'
When ab.account_type = 'LIABILITIES' or ab.account_type = 'LIABILITIES1' Then 'Liability'
When ab.account_type = 'EXPENSE' or ab.account_type = 'EXPENSE1' or ab.account_type = 'EXPENSE2'
Or ab.account_type = 'COGS' Then 'Expense'
When ab.account_type = 'REVENUES' Then 'Revenue'
When ab.account_type = 'EQUITY' Then 'Equity'
Else ab.account_type
End ACCOUNT_TYPE,
'TRUE' ACTIVE_ACCOUNT,
Case
When Sum(ab.debet_balance) + Sum(ab.credit_balance) = 0 Then 'FALSE'
Else 'TRUE'
End ACTIVITY_IN_PERIOD,
' ' ALTERNATE_CURRENCY,
Case
When ab.company = 'ZZZZ' Then 'USD'
When ab.company = 'SSSS' Then 'CAD'
When ab.company = 'wwww' Then 'EUR'
When ab.company = 'wwwwE' Then 'USD'
When ab.company = 'QWQW' Then 'CNY'
End ACCOUNT_CURRENCY,
To_Char(Trunc(Last_Day(Sysdate - 10)),'mm/dd/yyyy') PERIOD_END_DATE,
' ' GL_REPORTING_BALANCE,
Sum(ab.amount_balance) GL_ACCOUNT_BALANCE,
' ' ACCOUNT_REFERENCE2,
' ' ACCOUNT_REFERENCE3,
' ' ACCOUNT_REFERENCE4,
' ' ACCOUNT_REFERENCE5,
' ' ACCOUNT_REFERENCE6
From account a
Left Outer Join accounting_balance_budget ab
On ab.account = a.account
And ab.company = a.company
Where ab.accounting_year = Extract(year from Sysdate - 10)
And ab.accounting_period <= Extract(Month from Sysdate - 10)
And Sysdate between a.valid_from and a.valid_until
And ab.company in ('ZZZZ','SSSS','wwww','wwwwE','QWQW')
And (Substr(ab.account,1,1) in ('1','2','3','4','5','6','7','8') or Substr(ab.account,1,4) = '9999')
Group by ab.company,ab.account,ab.company, ab.account_type, ab.accounting_year,ab.code_b,ab.CODE_B_DESC, a.accnt_group, a.description
HAVING Sum(ab.amount_balance) >0
Order by 2, 1;
在我看来,你发布的代码太复杂了。你应该发布一些更简单的东西 无论如何:如果我理解正确的话,您正在寻找一个listag函数,该函数聚合列值,在单个列中逐个列出列值,并使用SUM函数计算余额汇总 示例代码:
SELECT entity_unique_identifier,
account_number,
ab_code_b,
account_description,
account_type,
--
LISTAGG (some_other_column, ', ') WITHIN GROUP (ORDER BY NULL) some_other_column,
SUM (gl_account_balance) sum_gl_account_balance
FROM ...
WHERE ...
GROUP BY entity_unique_identifier,
account_number,
ab_code_b,
account_description,
account_type;
如您所见,未聚合的列必须在GROUPBY子句中列出
一个简单的例子,基于Scott的EMP表:
->还有一个问题,我可以将所有帐户移到一行。但是,在同一字段中多次列出帐号,例如1234、1234、1234。是否有办法使其在该字段中只显示一次帐号,例如1234?这取决于Oracle数据库版本。在12c之前,LISTAGG无法创建不同的列表,因此您首先必须使用子查询获取不同的值,然后对它们进行聚合。更高版本的Oracle支持LISTAGGDISTINCT。。。。
SQL> select deptno,
2 job,
3 listagg(ename, ', ') within group (order by null) enames,
4 sum(sal) sum_salary
5 from emp
6 group by deptno,
7 job;
DEPTNO JOB ENAMES SUM_SALARY
---------- --------- ---------------------------------------- ----------
10 CLERK MILLER 1300
10 MANAGER CLARK 2450
10 PRESIDENT KING 5000
20 CLERK ADAMS, SMITH 1900
20 ANALYST FORD, SCOTT 6000
20 MANAGER JONES 2975
30 CLERK JAMES 950
30 MANAGER BLAKE 2850
30 SALESMAN ALLEN, MARTIN, TURNER, WARD 5600
9 rows selected.
SQL>