2016-09-19 66 views
-1

排除SELECT語句的列組我有一個生成一個報告by子句

select 
    cust.firstname as "FIRST NAME", 
    cust.lastname as "LAST NAME", 
    dept.name as "DEPARTMENT", 
    subdept.name as "SUB DEPARTMENT", 
    count(*) "cust type" 
from cust 
join dept on dept.deptid = cust.deptid 
join subdept on subdept.deptid = cust.subdeptid 
join custactivity on custactivity.custid = cust.custid 
where custactivity.swipetime > (trunc(sysdate - 1)) 
group by cust.firstname,cust.lastname,dept.name,subdept.name 
having count(*) > 5 
order by "DEPARTMENT" ; 

現在下面的查詢,我想包括列「custactivity.swipetime」只有在SELECT語句,但沒有組by子句,因爲它是一個時間字段,如果將它包含在group by子句中,我會得到不正確的結果。這可能怎麼樣?

我試過在ORACLE Select and group by excluding one field 的解決方案,但它沒有解決。

任何人都可以幫忙嗎?

+2

您希望爲這個非分組列的哪個值?如果這個值不是唯一的,那麼你可以分組。如果它有多個值,你會期望哪一個? – Grayson

+0

你在問Oracle還是PostgreSQL? PL/SQL如何處理?不要標記不涉及的產品和語言。 –

+0

我刪除了Postgres和PL/SQL標記,因爲這顯然是Oracle的一個SQL唯一問題 –

回答

0

每個顧客可能有很多的custactivities。所以你必須告訴DBMS選擇哪個swipetime。例如最新的:

, max(custactivity.swipetime) as "last swipe time" 

在下面你說你要每cust.firstname,cust.lastname,dept.name,subdept.name, custactivity.swipetime一個結果行的註釋。所以swipetime必須添加到group by子句中。

這是您的swipetime添加到group by子句的查詢。您需要在原始組上使用SUM分析函數。由於您無法在having子句中使用分析函數,因此您需要周圍的查詢。

select * 
from 
(
    select 
    cust.firstname as "FIRST NAME", 
    cust.lastname as "LAST NAME", 
    dept.name as "DEPARTMENT", 
    subdept.name as "SUB DEPARTMENT", 
    custactivity.swipetime as "SWIPE TIME", 
    sum(count(*)) over (partition by 
         cust.firstname, 
         cust.lastname, 
         dept.name, 
         subdept.name) as "cust type" 
    from cust 
    join dept on dept.deptid = cust.deptid 
    join subdept on subdept.deptid = cust.subdeptid 
    join custactivity on custactivity.custid = cust.custid 
    where custactivity.swipetime > (trunc(sysdate - 1)) 
    group by 
    cust.firstname, 
    cust.lastname, 
    dept.name, 
    subdept.name, 
    custactivity.swipetime 
) 
where "cust type" > 5 
order by "DEPARTMENT"; 
+0

我想要所有實例...不僅僅是最新的一個 – Lisa

+0

您將爲每個名字,姓氏,部門名稱獲取一個結果行,並且子代名稱。您不希望將swipetime添加到group by子句中,因爲那樣您會爲每個名字,姓氏,部門名稱,子代名稱和swipetime獲得一個結果行。因此,對於您當前的分組,一個結果行可以有多個滑動時間。你想要一個包含所有這些swipetimes的字符串的列嗎?然後你會使用'LISTAGG'。或者你還有什麼想法? –

+0

假設客戶有n次刷卡時間,我希望客戶的所有n次刷卡時間都相同。 因爲我不想基於刷卡時間來計數,只是通過除了刷卡時間以外的其他列進行計數 – Lisa