[英]Oracle SQL Group By if
在我的應用程序中,我記錄了下表中打開的文件:
TESTID SITE LATEST_READ READ_COUNT FILE_ORIGIN_ID
------------- ---------- ----------- ---------- --------------
File1 |Site1 |02/05/13 | 2| 1
File1 |Site2 |22/01/14 | 3| 2
File2 |Site1 |02/06/14 | 8| 0
File3 |Site1 |19/09/14 | 17| 0
File4 |Site2 |19/09/14 | 14| 2
File4 |Site2 |19/09/14 | 34| 1
File4 |Site3 |19/09/14 | 10| 0
File5 |Site2 |19/09/14 | 44| 2
File5 |Site3 |19/09/14 | 1| 2
如果文件的FILE_ORIGIN_ID
至少之一不同於2
我想獲取每個文件的讀取計數的總和。
這個例子應該給出:
TESTID SITE LATEST_READ SUM FILE_ORIGIN_ID
------------- ---------- ----------- ---------- --------------
File1 |Site1 |02/05/13 | 5| 1
File2 |Site1 |02/06/14 | 8| 0
File3 |Site1 |19/09/14 | 17| 0
File4 |Site2 |19/09/14 | 58| X <-- can be 0 or 1
File5 |Site2 |19/09/14 | 44| 2
File5 |Site3 |19/09/14 | 1| 2
我嘗試了以下方法:
SELECT TESTID, SUM(READ_COUNT), LATEST_READ, FILE_ORIGIN_ID, site
FROM FILE_USAGE_LOG
GROUP BY TESTID, TESTID, LATEST_READ,
CASE
WHEN FILE_ORIGIN_ID <> '2' Then 1
ELSE 0
END, site
ORDER BY TESTID;
但這不是我想要做的...我該如何改善呢? 而如果將行分組,我該如何將FILE_ORIGIN_ID
設置為0或1
現在,我得到了部分結果,它將以您需要的格式返回TESTID和READ_COUNT:
select testid, read_count FROM
(SELECT testid, sum(read_count) as read_count
FROM FILE_USAGE_LOG
where testid in (select distinct testid from FILE_USAGE_LOG
where not file_origin_id = 2)
group by testid)
UNION
(select testid, read_count
FROM FILE_USAGE_LOG
where testid not in (select distinct testid from FILE_USAGE_LOG
where not file_origin_id = 2))
ORDER BY testid
這不是您想要的確切結果,因為在其他字段上進行分組將為您提供不同的結果,但是,如果要獲取除testid(我們正在分組的數據)之外的任何其他數據,則需要將它們匯總在一起函數編輯:添加了不同的值(隨機排列為最小或最大,我認為合適)
select testid,site, read_count,latest_read,file_origin_id, grouped FROM
(SELECT testid, MIN(site) as site, sum(read_count) as read_count
, max(latest_read) as latest_read, min(file_origin_id) as file_origin_id
,'true' as grouped
FROM mytable
where testid in (select distinct testid from mytable
where not file_origin_id = 2)
group by testid)
UNION
(select testid, site, read_count, latest_read, file_origin_id, 'false' as grouped
FROM mytable
where testid not in (select distinct testid from mytable
where not file_origin_id = 2))
ORDER BY testid
Oracle 11g R2架構設置 :
CREATE TABLE FILE_USAGE_LOG (TESTID, SITE, LATEST_READ, READ_COUNT, FILE_ORIGIN_ID ) AS
SELECT 'File1', 'Site1', DATE '2013-05-02', 2, 1 FROM DUAL
UNION ALL SELECT 'File1', 'Site2', DATE '2014-01-22', 3, 2 FROM DUAL
UNION ALL SELECT 'File2', 'Site1', DATE '2014-06-02', 8, 0 FROM DUAL
UNION ALL SELECT 'File3', 'Site1', DATE '2014-09-19', 17, 0 FROM DUAL
UNION ALL SELECT 'File4', 'Site2', DATE '2014-09-19', 14, 2 FROM DUAL
UNION ALL SELECT 'File4', 'Site2', DATE '2014-09-19', 34, 1 FROM DUAL
UNION ALL SELECT 'File4', 'Site3', DATE '2014-09-19', 10, 0 FROM DUAL
UNION ALL SELECT 'File5', 'Site2', DATE '2014-09-19', 44, 2 FROM DUAL
UNION ALL SELECT 'File5', 'Site3', DATE '2014-09-19', 1, 2 FROM DUAL;
查詢1 :
SELECT TESTID,
REGEXP_REPLACE(
LISTAGG( SITE, ', ' )
WITHIN GROUP( ORDER BY SITE ),
'([^, ]+)(, \1)+($|, )',
'\1\3'
) AS SITES,
MAX( LATEST_READ ) AS LATEST_READ,
SUM(READ_COUNT) AS Total_Read_Count
FROM FILE_USAGE_LOG
GROUP BY
TESTID
HAVING COUNT( CASE FILE_ORIGIN_ID WHEN 2 THEN NULL ELSE 1 END ) > 0
UNION ALL
SELECT TESTID,
SITE,
LATEST_READ,
READ_COUNT
FROM FILE_USAGE_LOG l
WHERE FILE_ORIGIN_ID = 2
AND NOT EXISTS ( SELECT 'X'
FROM FILE_USAGE_LOG x
WHERE x.TESTID = l.TESTID
AND x.FILE_ORIGIN_ID <> 2
)
ORDER BY 1,2
結果 :
| TESTID | SITES | LATEST_READ | TOTAL_READ_COUNT |
|--------|--------------|-----------------------------|------------------|
| File1 | Site1, Site2 | January, 22 2014 00:00:00 | 5 |
| File2 | Site1 | June, 02 2014 00:00:00 | 8 |
| File3 | Site1 | September, 19 2014 00:00:00 | 17 |
| File4 | Site2, Site3 | September, 19 2014 00:00:00 | 58 |
| File5 | Site2 | September, 19 2014 00:00:00 | 44 |
| File5 | Site3 | September, 19 2014 00:00:00 | 1 |
查詢2 :
SELECT TESTID,
REGEXP_REPLACE(
LISTAGG( SITE, ', ' )
WITHIN GROUP( ORDER BY SITE ),
'([^, ]+)(, \1)+($|, )',
'\1\3'
) AS SITES,
MAX( LATEST_READ ) AS LATEST_READ,
SUM(READ_COUNT) AS Total_Read_Count
FROM FILE_USAGE_LOG
WHERE TESTID NOT LIKE 'this%'
AND LATEST_READ BETWEEN DATE '2014-01-01' AND DATE '2014-12-31'
GROUP BY
TESTID
HAVING COUNT( CASE FILE_ORIGIN_ID WHEN 2 THEN NULL ELSE 1 END ) > 0
UNION ALL
SELECT TESTID,
SITE,
LATEST_READ,
READ_COUNT
FROM FILE_USAGE_LOG l
WHERE FILE_ORIGIN_ID = 2
AND NOT EXISTS ( SELECT 'X'
FROM FILE_USAGE_LOG x
WHERE x.TESTID = l.TESTID
AND x.FILE_ORIGIN_ID <> 2
AND TESTID NOT LIKE 'this%'
AND LATEST_READ BETWEEN DATE '2014-01-01' AND DATE '2014-12-31'
)
AND TESTID NOT LIKE 'this%'
AND LATEST_READ BETWEEN DATE '2014-01-01' AND DATE '2014-12-31'
ORDER BY 1,2
結果 :
| TESTID | SITES | LATEST_READ | TOTAL_READ_COUNT |
|--------|--------------|-----------------------------|------------------|
| File1 | Site2 | January, 22 2014 00:00:00 | 3 |
| File2 | Site1 | June, 02 2014 00:00:00 | 8 |
| File3 | Site1 | September, 19 2014 00:00:00 | 17 |
| File4 | Site2, Site3 | September, 19 2014 00:00:00 | 58 |
| File5 | Site2 | September, 19 2014 00:00:00 | 44 |
| File5 | Site3 | September, 19 2014 00:00:00 | 1 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.