2016-08-02 91 views
1

在另一個字段中使用聚合時,是否有安全的方式可以不需要按字段進行分組?以下是分組我只是得到984行,但由A.InvoiceDateId場分組後我得到了11K的行之前,我的例子擺脫分組字段

SELECT 

C.CustomerName 
,D.INDUSTRY_CODE 

,CASE WHEN D.INDUSTRY_CODE IN ('003','004','005','006','007','008','009','010','017','029') 
    THEN 'PM' 
    WHEN UPPER(CustomerName) = 'ULINE INC' 
    THEN 'ULINE' 
    ELSE 'DR' 
    END AS BU 

,ISNULL((SELECT SUM(GrossAmount) 
where CONVERT(date,convert(char(8),InvoiceDateID)) between DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) - 1, 0) and DATEADD(year, -1, GETDATE())),0) [PREVIOUS YEAR GROSS] 

FROM factMargins A 
LEFT OUTER JOIN dimDate B ON A.InvoiceDateID = B.DateId 
LEFT OUTER JOIN dimCustomer C ON A.CustomerID = C.CustomerId 
LEFT OUTER JOIN CRCDATA.DBO.CU10 D ON D.CUST_NUMB = C.CustomerNumber 

GROUP BY 
C.CustomerName,D.INDUSTRY_CODE 
,A.InvoiceDateID 

order by CustomerName 

。由於每個客戶有多個發票,所以這些行會被炸燬。 Min和Max不會工作,因爲那樣會導致數據不正確。是否最好讓我的應用程序(水晶)擺脫多餘的線?通常,我希望我的基礎數據儘可能接近報表的佈局,如果可能的話。

回答

0

嘗試將引用移至InvoiceDateID到一個聚合函數中,而不是在選定子查詢的WHERE子句中。

在Oracle中,這裏有一個例子:

with TheData as (
select 'A' customerID, 25 AMOUNT , trunc(sysdate) THEDATE from dual union 
select 'B' customerID, 35 AMOUNT , trunc(sysdate-1) THEDATE from dual union 
select 'A' customerID, 45 AMOUNT , trunc(sysdate-2) THEDATE from dual union 
select 'A' customerID, 11000 AMOUNT , trunc(sysdate-3) THEDATE from dual union 
select 'B' customerID, 12000 AMOUNT , trunc(sysdate-4) THEDATE from dual union 
select 'A' customerID, 15000 AMOUNT , trunc(sysdate-5) THEDATE from dual) 
select 
    CustomerID, 
    sum(amount) as "AllRevenue" 
    sum(case when thedate<sysdate-3 then amount else 0 end) as "OlderRevenue", 
from thedata 
group by customerID; 

輸出:

CustomerID | AllRevenue | OlderRevenue 
A | 26070 | 26000 
B | 12035 | 12000 

這是說:

  • 對於每一個的customerID
  • 我希望所有的總和相當於
  • ,我想要3天前的金額總和
+0

這有助於感謝 –