Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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_Sql Server 2008 - Fatal编程技术网

Sql 在聚合中解决聚合问题

Sql 在聚合中解决聚合问题,sql,sql-server-2008,Sql,Sql Server 2008,我试图计算此查询中每个授权号的天数总和,但出现一个错误,指出聚合函数无法对具有聚合的表达式执行。我怎样才能解决这个问题?有多个授权编号,希望最小和最大日期以天为单位提供准确的结果 SELECT CASE WHEN DBO.FN_AGE(CL_DOB, AH_ADMDT) >= 18 THEN 'ADULT' WHEN DBO.FN_AGE(CL_DOB, AH_ADMDT) < 18 THEN 'CHILD' ELSE

我试图计算此查询中每个授权号的天数总和,但出现一个错误,指出聚合函数无法对具有聚合的表达式执行。我怎样才能解决这个问题?有多个授权编号,希望最小和最大日期以天为单位提供准确的结果

SELECT 
    CASE 
        WHEN DBO.FN_AGE(CL_DOB, AH_ADMDT) >= 18 THEN 'ADULT' 
        WHEN DBO.FN_AGE(CL_DOB, AH_ADMDT) < 18 THEN 'CHILD'  
        ELSE NULL 
    END As AgeGroup,
    COUNT(DISTINCT AH_AUTHNO) AS 'Total AFC Admissions',
    SUM(DATEDIFF(DD, MIN(AH_ADMDT), MAX(AH_DISDT))) AS 'Total AFC Days',
    SUM(AD_UNTAUTH) AS 'Total Units'
FROM 
    PCHAUHPF AS A
    LEFT JOIN
    PCHAUDPF AS P
        ON A.AH_RCDID = P.ADF_AUHID
    JOIN
    GTWAUDPF AS G
        ON G.ADP_AUDID = P.AD_RCDID
    JOIN
    PCHCLTPF AS C
        ON C.CL_RCDID = A.AHF_CLTID
    JOIN
    PCHXSPPF AS X
        ON X.XP_RCDID = P.ADF_XSPID
    JOIN
    PCHCPTPF AS T
        ON T.CR_RCDID = X.XPF_CPTID
WHERE 
    AH_ADMDT BETWEEN '10-1-2013' AND '09-30-2014'
    AND AD_PAYSTS = 'A'
    AND CR_CODE IN ('H2016', 'T1020')
GROUP BY
    CASE 
        WHEN DBO.FN_AGE(CL_DOB, AH_ADMDT) >= 18 THEN 'ADULT' 
        WHEN DBO.FN_AGE(CL_DOB, AH_ADMDT) < 18 THEN 'CHILD'  
        ELSE NULL 
    END
选择
案例
当DBO.FN_年龄(CL_DOB,AH_ADMDT)>=18时,则为“成人”
当DBO.FN_年龄(CL_DOB,AH_ADMDT)<18岁时,则为“儿童”
否则无效
以年龄组结束,
将(不同的AHU AUTHNO)计算为“AFC总入院人数”,
总和(日期差(DD,最小值(AH_ADMDT),最大值(AH_DISDT)),作为“AFC总天数”,
总计(未授权)为“总单位”
从…起
PCHAUHPF作为
左连接
pchaudpfasp
关于A.AH_RCDID=P.ADF_AUHID
参加
GTWAUDPF作为G
关于G.ADP_AUDID=P.AD_RCDID
参加
PCHCLTPF AS C
在C.CL_RCDID=A.AHF_CLTID上
参加
PCHXSPPF AS X
在X.XP_RCDID=P.ADF_XSPID上
参加
PCHCPTPF AS T
在T.CR_RCDID=X.XPF_CPTID上
哪里
2013年10月1日至2014年9月30日之间的AH_ADMDT
而AD_PAYSTS='A'
以及('H2016','T1020'中的CR_代码)
分组
案例
当DBO.FN_年龄(CL_DOB,AH_ADMDT)>=18时,则为“成人”
当DBO.FN_年龄(CL_DOB,AH_ADMDT)<18岁时,则为“儿童”
否则无效
结束

您想要的表达式可能是以下表达式之一:

SUM(DATEDIFF(DAY, AH_ADMDT, AH_DISDT)) AS [Total AFC Days],
或:


关于样式,我建议您仅对字符串和日期常量使用单引号(而不是列别名)。使用
datediff()
时,请使用完整的日期部分名称。这样,您(或其他人)就不必费劲去记住
MM
是几个月还是几分钟。

下面是我从评论中提出的建议的一个简单示例:

WITH cte AS (
  SELECT 
     MyGroupCol
  ,  MIN(MyDateCol) AS MinDate
  ,  MAX(MyDateCol) AS MaxDate
  FROM MyTables
  WHERE SomeConditions=true
  GROUP BY MyGroupCol
)
SELECT 
  MyGroupCol
, SUM(DateDiff(dd, MinDate, MaxDate))
FROM cte
GROUP BY MyGroupCol

您可以使用CTE或子查询来实现这一点,首先在子查询中获取MIN/MAX,然后像在外部查询中使用常规列一样使用它们来获取SUM()。您可以提供一个示例吗?我想要的表达式是上述两者的组合。我喜欢我现在的风格。我认为sql人员应该知道DD=days,他们在sql Server中总是“帮助”。
WITH cte AS (
  SELECT 
     MyGroupCol
  ,  MIN(MyDateCol) AS MinDate
  ,  MAX(MyDateCol) AS MaxDate
  FROM MyTables
  WHERE SomeConditions=true
  GROUP BY MyGroupCol
)
SELECT 
  MyGroupCol
, SUM(DateDiff(dd, MinDate, MaxDate))
FROM cte
GROUP BY MyGroupCol