2013-02-23 42 views
1

我有一个编码为C#的asp.net项目。 我有这样的桌子;根据条件计算两个单元格

NAME  WORK_TYPE  FM   FM_HOUR 
------------------------------------------------- 
Mike   IN   -2800     
Mike   OUT   3400    ?? 
Jane   IN    400 
Jane   OUT   -100    ?? 

在这里我有这样的问题;我需要计算2个单元格的添加并将其与60分隔并写入右侧单元格。

例如;我需要计算Mike FM IN和Mike FM OUT的加法,并且我需要将它写入Mike FM_HOUR cell。

我该怎么做?

我写了这段代码,但它不工作,当然,只是为了帮助你;

SqlConnection conn; 
    SqlCommand cmd = new SqlCommand(); 
    string strSQL = "UPDATE bilgiler3 SET FM_HOUR= SELECT SUM((FM WHERE WORK_TYPE='OUT') + (FM WHERE WORK_TYPE='IN'))/60 " 
    string bag_str = WebConfigurationManager.ConnectionStrings["asgdb01ConnectionString"].ConnectionString; 
    conn = new SqlConnection(bag_str); 
    conn.Open();...... and goes like this 

请等待你的帮助。 我需要这样做。

非常感谢。

+0

是否有任何其他列除了'NAME','WORK_TYPE','FM','FM_HOUR' ? – 2013-02-23 16:31:49

+0

是否会有同一用户的多组输入/输出行?什么时候只有一个(或只有一个)? – 2013-02-23 16:47:36

回答

0

这里为选择使用sum() over功能的sql-fiddle-demo。我认为它支持sql-server 2005及以上。

我想你最好在存储过程而不是内联sql中执行此操作。

对于UPDATEsql-fiddle-demo

update T1 set T1.fm_hour = T2.fm_hour 
from T T1 join (Select distinct name,sum(fm) over (partition by name)/60 fm_hour 
       from T) T2 on T1.name = T2.name 
where T1.work_type = 'out' 

对于SELECT

Select name,work_type,fm, 
     case work_type 
      when 'out' then sum(fm) over (partition by name)/60 
      else null end fm_hour 
from yourTable 

| NAME | WORK_TYPE | FM | FM_HOUR | 
-------------------------------------- 
| Jane |  IN | 400 | (null) | 
| Jane |  OUT | -100 |  5 | 
| Mike |  IN | -2800 | (null) | 
| Mike |  OUT | 3400 |  10 | 
+0

在你的'update'例子中,'join'将为每个名称返回多行。所以你的更新可能多次更新一行。 – Andomar 2013-02-23 17:35:58

+0

@Andomar,true,用独特的更新。 tnx – Kaf 2013-02-23 17:40:04

+0

感谢您的回答。卜(按名称划分)这边是什么?我应该写什么? – 2013-02-23 21:58:44

1

这应该产生所期望的输出:

UPDATE bilgiler3 SET FM_HOUR= T.Result 
FROM (
    SELECT Name , SUM(FM)/60 AS Result 
    FROM bilgiler3 
    GROUP BY Name 
) T 
INNER JOIN bilgiler3 ON T.Name = bilgiler3.Name 
WHERE bilgiler3.Work_Type = 'OUT' 
相关问题