如何SQL - 在别名列名中使用聚合函数SUM

时间:2018-01-05 01:40:32

标签: sql sql-server sql-server-2012

如何计算列别名的总和" Performance_Indicators"。 我想总计Performance_Indicator的总和。 我不能使用SUM(Performance_Indicators)。

SELECT    a.username
          ,a.name
          ,a.description
          ,a.action_header 
          ,a.remarks
          ,e.complexity
          ,datediff(DAY, e.entry_date, a.datetime_stamp) as [man-days]

          ,CASE 
            WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
            = 0  THEN '1'
            WHEN e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
            >= 29 THEN '2'
            WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
            >= 14 THEN '3'
            WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
            >= 8 THEN '4'
            WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
            <= 7  THEN '5'

            ELSE '1'

         END AS Performance_Indicators,
         SUM(Performance_Indicators) as total



     from [s].[dbo].[tbl_de] a
        left join 
        [s].[dbo].[tbl_ce] e
        on a.reference_code = e.reference_code

         order by a.name asc

Sample expected output

3 个答案:

答案 0 :(得分:1)

更改CASE语句以生成整数而不是字符串,然后使用SUM(CASE ... END)作为Performance_Indicators。

答案 1 :(得分:1)

试试这个:

SELECT    a.username
      ,a.name
      ,a.description
      ,a.action_header 
      ,a.remarks
      ,e.complexity
      ,datediff(DAY, e.entry_date, a.datetime_stamp) as [man-days]

      ,SUM(CASE 
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        = 0  THEN 1
        WHEN e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 29 THEN 2
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 14 THEN 3
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 8 THEN 4
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        <= 7  THEN 5
        ELSE 1
     END) AS total
 from [s].[dbo].[tbl_de] a
    left join 
    [s].[dbo].[tbl_ce] e
    on a.reference_code = e.reference_code
GROUP BY a.username
      ,a.name
      ,a.description
      ,a.action_header 
      ,a.remarks
      ,e.complexity
      ,datediff(DAY, e.entry_date, a.datetime_stamp)
order by a.name asc

答案 2 :(得分:1)

要实现这一点,你应该在第一个句子上进行子查询,然后进行主要查询以求它。

试试这个

WITH CTE AS
(
SELECT    a.username
      ,a.name
      ,a.description
      ,a.action_header 
      ,a.remarks
      ,e.complexity
      ,datediff(DAY, e.entry_date, a.datetime_stamp) as [man-days]
      ,CASE 
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        = 0  THEN 1
        WHEN e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 29 THEN 2
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 14 THEN 3
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 8 THEN 4
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        <= 7  THEN 5
        ELSE 1
     END AS PerformanceIndicator
 from [s].[dbo].[tbl_de] a
    left join 
    [s].[dbo].[tbl_ce] e
      on a.reference_code = e.reference_code
)

SELECT    a.username
      ,a.name
      ,a.description
      ,a.action_header 
      ,a.remarks
      ,e.complexity
      ,datediff(DAY, e.entry_date, a.datetime_stamp) as [man-days]
      ,cte.PerformanceIndicator
      ,SUM(CASE 
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        = 0  THEN 1
        WHEN e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 29 THEN 2
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 14 THEN 3
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        >= 8 THEN 4
        WHEN  e.complexity = 'Simple'  AND datediff(DAY, e.entry_date, a.datetime_stamp)
        <= 7  THEN 5
        ELSE 1
     END) AS total
 from [s].[dbo].[tbl_de] a
    left join [s].[dbo].[tbl_ce] e on a.reference_code = e.reference_code
    inner join cte on cte.name = a.name and cte.description = a.description
GROUP BY a.username
      ,a.name
      ,a.description
      ,a.action_header 
      ,a.remarks
      ,e.complexity
      ,datediff(DAY, e.entry_date, a.datetime_stamp)
      ,cte.PerformanceIndicator
order by a.name asc