Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL语句来格式化表数据_Sql_Oracle_Oracle11g - Fatal编程技术网

SQL语句来格式化表数据

SQL语句来格式化表数据,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个下表,需要使用普通sql获取输出,如下图2所示。如果columnC中的任何一个值与columnC相同,则成功计数应为+1,否则应将其添加到输出的失败计数列中。我们是否可以编写一个SQL(在Oracle中)来获得下面提到的输出列D 1.桌子 2。所需输出 File_type ColumnD Success_cnt Fail_cnt ---------- -------- ----------- ----------- typeA

我有一个下表,需要使用普通sql获取输出,如下图2所示。如果
columnC
中的任何一个值与
columnC
相同,则成功计数应为+1,否则应将其添加到输出的失败计数列中。我们是否可以编写一个SQL(在Oracle中)来获得下面提到的输出<现在可以忽略代码>列D

1.桌子 2。所需输出

File_type        ColumnD  Success_cnt    Fail_cnt
----------       -------- -----------    -----------
typeA             SPILL         2          1
typeB             SPILL         3      
试试这个

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

您可以忽略列a输出,或者在外部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

以下是我试图理解您的任务:

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


这是为这项任务准备的。我使用了一个简化的数据样本。您可能希望使用不同的数据进行尝试。

一种方法是使用游标。您可以循环查看记录,并根据需要增加变量。你已经试过了吗?

你已经试过什么了?您熟悉
CASE
子句吗?您所说的“纯SQL”是什么意思?您将无法获得与OP请求相同的输出。请参阅我对“rs”答案的评论@卵が好き 这不是那么简单,不是OP要求的。虽然结果看起来是一样的。@PM77-1你能解释一下OP要求什么吗?(1)OP表示
ColumnD
不起任何作用(2)我的理解是,我们需要查看具有相同
ColumnA
值的行,如果这些行中有任何一行在
ColumnB
中有“Y”,那么我们就增加
成功
,否则我们将递增
Fail
@PM77-1,您看到他所需的输出了吗?@rs.-是的,我看到了。“11111”和“2222222”有“Y”,所以我们有2个代表成功,“333333”没有,所以1个代表失败。
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;