总和SQL Server

时间:2017-07-18 12:19:12

标签: sql sql-server

我有一个收集许多不同列的查询,我想要包含一个列,该列汇总订单中每个组件的价格。现在,我已经有一个列,只显示订单的每个组件的价格,但我不知道如何创建这个新列。

我认为代码会是这样的,但是当我尝试运行此代码时,我不清楚聚合函数是什么或为什么我会收到有关聚合函数的错误。

SELECT ID, Location, Price, (SUM(PriceDescription) FROM table GROUP BY ID WHERE PriceDescription LIKE 'Cost.%' AS Summary) FROM table

当我说每个组件时,我的意思是我拥有的每个ID都有许多不同的项目构成了一般价格。我只想知道我在压力清洗机上需要花多少钱才能买到这些,这就是为什么我说“价格描述如何......成本。%'

为了进一步说明,我收到了每个与我合作的客户的收据,在这些收据中,我记下了我使用的肥皂和我租用的高压清洗机的工具的费用。我用“成本”来标记所有这些。'所以它看起来像(Cost.Water),(Cost.Soap),(Cost.Gas),(Cost.Tools),我想这样,对于订单1,它是一个总和所有成本的列。 strong> _订单的价格和订单2的价格总和该订单的所有成本._ 价格。我还要提一下,每个订单的成本数量都不一样(有时当​​我使用我的电动洗衣机时,我可能不需要购买汽油,偶尔也不需要肥皂)。

我希望这是有道理的,如果没有,请告诉我如何进一步解释。

`ID    Location    Price     PriceDescription
 1     Park        10        Cost.Water
 1     Park        8         Cost.Gas
 1     Park        11        Cost.Soap
 2     Tom         20        Cost.Water
 2     Tom         6         Cost.Soap
 3     Matt        15        Cost.Tools
 3     Matt        15        Cost.Gas
 3     Matt        21        Cost.Tools
 4     College     32        Cost.Gas
 4     College     22        Cost.Water
 4     College     11        Cost.Tools`

我想在我的查询中创建一个类似

的列
`ID    Location    Price    Summary
 1     Park        10       29
 1     Park        8        
 1     Park        11       
 2     Tom         20       26
 2     Tom         6        
 3     Matt        15       51
 3     Matt        15       
 3     Matt        21       
 4     College     32       65
 4     College     22       
 4     College     11        `

但如果'摘要'在每一行都打印而不是在顶行打印,这也没关系。

3 个答案:

答案 0 :(得分:4)

您只要求总和(价格)超过(按地点划分)将给出如下总和:

SELECT ID, Location, Price, SUM(Price) over(Partition by Location) AS Summed_Price
   FROM yourtable
WHERE PriceDescription LIKE 'Cost.%' 

答案 1 :(得分:1)

首先,如果您的Price列确实包含与'Cost.%'匹配的值,则您不能对其应用SUM()。 SUM()需要一个数字(例如INT,FLOAT,REAL或DECIMAL)。如果是文本,则需要通过在SUM()调用中添加CAST或CONVERT子句将其显式转换为数字。

其次,您的查询语法错误:您需要GROUP BY,并且未正确指定SELECT字段。你想要SUM()价格字段,而不是PriceDescription字段(你甚至不能按照我的解释求和)

假设Price 数字(请参阅我的第一句话),那么就可以这样做:

SELECT ID
     , Location
     , Price
     , (SELECT SUM(Price)
        FROM table
        WHERE ID = T1.ID AND Location = T1.Location
       ) AS Summed_Price
FROM table AS T1

答案 2 :(得分:0)

获取有问题的确切结果

    Select  
                T.ID,
                T.Location,
                T.Price,
                CASE WHEN (R) = 1 then RN ELSE NULL  END Summary 
            from  (
    select 
                ID, 
                Location, 
                Price ,
                SUM(Price)OVER(PARTITION BY Location)RN,
                ROW_number()OVER(PARTITION BY Location ORDER BY ID )R 
            from  Table
     )T
order by T.ID