2013-02-23 2 views
1

У меня есть проект asp.net с кодировкой C#. У меня есть такой стол;Расчет двух ячеек по условию

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, и мне нужно записать его в ячейку Майка FM_HOUR.

Как я могу это сделать?

Я написал этот код, но он, конечно, не работает, просто чтобы помочь вам;

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' ? –

+0

Будет ли когда-либо несколько наборов строк ввода/вывода для одного и того же пользователя? Как насчет того, когда есть только (или только выход)? –

ответ

0

Вот sql-fiddle-demo для выбора с помощью функции sum() over. I думаю поддерживает sql-сервер 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

+0

@Andomar, правда, обновлено с четким. tnx – Kaf

+0

спасибо за ответ. Bu (раздел по имени), что это за сторона? что мне там писать? –

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' 
Смежные вопросы