执行SUM和CASE WHEN

时间:2014-06-03 16:40:01

标签: sql

我正在使用SQL Server 2008。

我收到此错误:

  

在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我想:

  1. 选择表格b
  2. 中的所有列
  3. 如果有同一个numberID,我想执行SUM并返回一行结果
  4. 此外,如果只有一个numberID我想返回结果
  5. 我想创建另一个列Case,其输出结果为“Percentage is ...”(列百分比值)
  6. 到目前为止

    代码:

    select distinct 
       b.*, 
       case 
          when b.NumberID = b.NumberID then SUM(d.Percentage) 
       end as Percentage, 
       NULL as LName, 
       NULL as FName, 
       'Percentage is' + convert(VARCHAR(20), 
                                 CASE WHEN b. NumberID = b.NumberID 
                                        THEN SUM(d.Percentage) END) as Case
    
    from 
        Accounting b
    join (
         select b.* 
         from Accounting b
    
        join (
            select number
                 , MAX(id) id 
            from Accounting 
            where Date < '2012-12-01'
            group by number
            ) a 
        on b.number = a.number
             and b.Id = a.id
        ) b2 
    on b.number = b2.number 
    where b.Date > '2012-12-01'
    group by b.NumberID
    

4 个答案:

答案 0 :(得分:0)

在联接下的SELECT中使用distinct。

//etc.
join 
(
select DISTINCT b.* from 
  Accounting b
//etc.

答案 1 :(得分:0)

您的案例语法不正确。检查manual。 它应该是这样的:

CASE case_value
    WHEN when_value

所以在你的情况下(jeje)

select distinct b.*, 
case b.NumberID when  b.NumberID then ...
确实很奇怪。 b.NumberID始终是b.NumberID:o

答案 2 :(得分:0)

SELECT b.NumberID, SUM(b.Percentage) AS Percentage, 
(
  SELECT MAX(s.id)
  FROM Accounting s
  WHERE s.Date < '2012-12-01' AND s.number = b.number
) AS MaxID
FROM Accounting b
WHERE b.Date > '2012-12-01'
GROUP BY b.NumberID    

答案 3 :(得分:0)

您需要在Group By子句中包含select语句中的所有列。让我们说我有一张冰淇淋的餐桌和订购它们的人。我有数据说

  • 乔点了巧克力
  • 凯蒂下令草莓
  • 玛丽点了巧克力

如果我告诉sql按照冰淇淋的味道分组,我告诉它我只想要一行返回该味道。通过在我的选择中包含客户的名字,我要求sql订购每种口味。我怎样才能(在一排)展示谁订购了巧克力?为了向sql索取我想要的信息,我需要为每个顾客和每个冰淇淋口味排一行(也许玛丽昨天点了草莓)。所以,我需要顾客和冰淇淋的味道。

Agregate函数不需要在group by子句中,因为您向sql询问有关数据的特定问题。也许我想知道那个名字首先按字母顺序排列的人。然后,我可以通过冰淇淋口味选择最大(顾客)和组。

Select b.id, b.number, b.firmname, b.date, sum(...)
From 
Group by b.id, b.number, b.firmname, b.date

注意:

  • 只要您命名所有列,您仍然可以使用b。*语法
  • 在你的小组中
  • 您的选择中不再需要使用distinct关键字,因为 group by基本上是一回事