Sql 去掉分组字段

Sql 去掉分组字段,sql,crystal-reports,Sql,Crystal Reports,在另一个字段中使用聚合时,是否有安全的方法不必按字段分组?这是我的例子 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' EL

在另一个字段中使用聚合时,是否有安全的方法不必按字段分组?这是我的例子

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

在分组之前,我只得到984行,但在按A.InvoiceDateId字段分组之后,我得到了超过11k行。因为每个客户都有多张发票,所以行会放大。最小值和最大值不起作用,因为它会错误地提取数据。最好让我的应用程序(crystal)去掉多余的行吗?通常我希望我的基础数据尽可能接近报告的布局(如果可能)

尝试将对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
  • 我要所有金额的总和
  • 我要的是3天前的金额总和

尝试将对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
  • 我要所有金额的总和
  • 我要的是3天前的金额总和