我有一个下面的表,需要使用普通的sql获取输出,如下所示2.如果columnC
对于的任何具有相同值{{1}的'Y'成功计数应为+1,否则应将其添加到输出的失败计数列。我们可以写一个SQL(在Oracle中)来获得如下所述的输出吗? ColumnA
暂时可以忽略。
ColumnD
2。所需输出
ColumnA ColumnB ColumnC ColumnD File_type
-------- --------- -------- ---------- ------------
11111 A N NULL typeA
11111 B N NULL typeA
11111 C Y SPILL null
11111 D N NULL typeA
22222 A N SPILL typeA
22222 B Y SPILL typeA
22222 C N NULL null
22222 D N NULL typeA
33333 A N NULL typeA
33333 B N NULL null
33333 C N NULL typeA
33333 D N NULL typeA
111110 A N NULL typeB
111110 B N NULL typeB
111110 C Y SPILL null
111110 D N NULL typeB
222220 A N SPILL typeB
222220 B Y SPILL typeB
222220 C N NULL null
222220 D N NULL typeB
333330 A N NULL typeB
333330 B N NULL null
333330 C Y SPILL typeB
333330 D N NULL typeB
答案 0 :(得分:0)
试试这个
with CTE as
(
select A.columnA, columnc,
row_number() over (partition by columnA order by columnc desc) rnk
from T A
), cte2 as
(
SELECT distinct columna, file_type from t where file_type is not null
), cte3 as
(
select distinct columnd, file_type from t
where file_type is not null and columnd is not null
)
select a.file_type, a.columnd,
count(case when columnc = 'Y' then 1 end) Success_cnt,
count(case when columnc = 'N' then 1 end) fail_cnt
from cte3 a
inner join cte2 b on a.file_type = b.file_type
inner join
(select * from cte where rnk = 1) c on b.columnA = c.columnA
group by a.file_type, a.columnd
答案 1 :(得分:0)
您可以忽略columnA输出,或者在外部select中将其作为派生表运行...
SELECT
ColumnA,
File_type,
CountIf(Max(ColumnC),'Y') as "Success_cnt",
CountIf(Max(ColumnC),'N') as "Fail_cnt"
FROM
table
Group By
ColumnA,
File_type
答案 2 :(得分:0)
这是我尝试理解你的任务:
SELECT r.File_type, SUM(CASE WHEN r.cnt > 0 THEN 1 ELSE 0 END) success,
SUM(CASE WHEN r.cnt = 0 THEN 1 ELSE 0 END) fail
FROM
(SELECT t.File_type, SUM(CASE WHEN t.ColumnC = 'Y' THEN 1 ELSE 0 END) cnt
FROM Table1 t
WHERE t.File_type IS NOT NULL
GROUP BY t.file_type, t.ColumnA) r
GROUP BY r.File_type;
我根本没有使用ColumnB
和ColumnC
。
此任务的SQL Fiddle。我使用了简化数据样本。您可能希望使用不同的数据进行尝试。
答案 3 :(得分:0)
执行此操作的一种方法是使用游标。您可以遍历记录并根据需要增加变量。你有没试过这个?