Member 11398913 Ответов: 1

Как подсчитать дежурные дни в таблице дежурств в SQL server


у меня есть таблица обязанностей в sql server
в таблице у меня есть 7 дней
сб, вс, Монд,... пятница
во всех полях пользователь вставляет "м" как тип обязанности и другой тип обязанности за 7 дней недели, я хочу подсчитать, сколько типов обязанностей "М" за неделю.

Что я уже пробовал:

select Dutyid,EmpName,sum(CASE WHEN saturday ='M' THEN 1 ELSE 0 END) SAT.
from DutyView
Group by Dutyid,EmpName

1 Ответов

Рейтинг:
7

Wendelius

Если я правильно понял вопрос, у вас есть таблица, содержащая отдельный столбец для каждого дня недели?

Если это так, я бы предложил другую структуру. Вместо использования отдельных столбцов используйте строки. Другими словами стол может выглядеть примерно так

DutyTable
---------
- Столбец empname
- Будний день
- DutyType

А данные могут быть примерно такими (1 = воскресенье, 7 = суббота)

EmpName   Weekday   DutyType
-------   -------   --------
Mr Smith  1         A
Mr Smith  2         M
Mr Smith  3         M
Mr Smith  4         M
Mr Smith  5         M
Mr Smith  6         M
Mr Smith  7         B

Теперь ваш запрос может выглядеть примерно так

SELECT EmpName, 
       SUM(CASE DutyType 
              WHEN 'M' THEN 1
              ELSE 0 
       END)
FROM DutyTable
GROUP BY EmpName

Это всего лишь простой пример, поэтому вам, вероятно, нужно добавить соответствующие столбцы в соответствии с вашими требованиями.

ДОПОЛНЕНИЕ:
---------
Рассмотрим следующий пример
CREATE TABLE DutyTest (
   DutyId   int,
   EmpName  varchar(100),
   DayId    int,
   DutyType char
);

INSERT INTO DutyTest VALUES
(1,  'Mr Smith', 1, 'M'),
(2,  'Mr Smith', 2, 'M'),
(3,  'Mr Smith', 3, 'M'),
(4,  'Mr Smith', 4, 'M'),
(5,  'Mr Smith', 5, 'A'),
(6,  'Mr Smith', 6, 'D'),
(7,  'Mr Smith', 7, 'A'),
(8,  'Mr Wick',  1, 'A'),
(9,  'Mr Wick',  2, 'A'),
(10, 'Mr Wick',  3, 'D'),
(11, 'Mr Wick',  4, 'A'),
(12, 'Mr Wick',  5, 'M'),
(13, 'Mr Wick',  6, 'A'),
(14, 'Mr Wick',  7, 'A');

SELECT EmpName, 
       SUM(CASE DutyType 
              WHEN 'M' THEN 1
              ELSE 0 
       END) AS M_Days
FROM DutyTest
GROUP BY EmpName;

Результат для запроса будет следующим
EmpName    M_Days
--------   ------
Mr Smith   4
Mr Wick    1



Дополнение 2
-----------
Для запроса текущей таблицы в базе данных можно использовать что-то вроде следующего
CREATE TABLE DutyTest2 (
   DutyId    int,
   EmpName   varchar(100),
   Sunday    char, 
   Monday    char, 
   Tuesday   char, 
   Wednesday char, 
   Thursday  char, 
   Friday    char, 
   Saturday  char
);

INSERT INTO DutyTest2 VALUES
(1,  'Mr Smith', 'M', 'M', 'M', 'M', 'A', 'D', 'A'),
(2,  'Mr Smith', 'M', 'M', 'D', 'A', 'A', 'D', 'A'),
(3,  'Mr Wick',  'A', 'A', 'A', 'M', 'A', 'D', 'A'),
(4,  'Mr Wick',  'M', 'M', 'D', 'A', 'M', 'M', 'A');

SELECT DutyId,
       EmpName, 
       SUM(CASE Sunday    WHEN 'M' THEN 1 ELSE 0 END 
	     + CASE Monday    WHEN 'M' THEN 1 ELSE 0 END 
	     + CASE Tuesday   WHEN 'M' THEN 1 ELSE 0 END 
	     + CASE Wednesday WHEN 'M' THEN 1 ELSE 0 END 
	     + CASE Thursday  WHEN 'M' THEN 1 ELSE 0 END 
	     + CASE Friday    WHEN 'M' THEN 1 ELSE 0 END 
	     + CASE Saturday  WHEN 'M' THEN 1 ELSE 0 END) AS M_Days
FROM DutyTest2
GROUP BY DutyId,
         EmpName;

Запрос должен произвести
DutyId   EmpName    M_Days
------   --------   ------
1        Mr Smith   4
2        Mr Smith   2
3        Mr Wick    1
4        Mr Wick    4

Надеюсь, это поможет


Member 11398913

Спасибо ,моя структура таблицы такова
DutyID , столбец empname, сб,вс,пн,ТУС,Ср,Чт,Пт
в каждое поле пользователь вставляет тип пошлины в виде буквы "М", например, через 3 и более дней
СБ "м"
солнце 'м'
пн 'м'
tus 'M'
СР. "а"
чт 'Д'
ПТ 'а'
я хочу посчитать, если Эми. имеет более чем 3-дневный дежурный тип "М"
чем показать подол еще не показывали.
я надеюсь, что мой вопрос ясен, потому что мой английский не в порядке

Wendelius

Как я и предлагал, не используйте дни недели в качестве столбцов, вместо этого поместите их в строки. Основываясь на предоставленных вами данных, ваша структура таблицы может быть
- DutyId
- Столбец empname
- будний день
- DutyType

Другими словами, в настоящее время у вас есть 1 строка, содержащая все будние дни в течение недели. И я предлагаю, чтобы у вас было 7 строк в течение одной недели, каждый будний день как отдельная строка.

Wendelius

Смотрите обновленное решение

Member 11398913

большое спасибо за Вашу поддержку, но у меня есть много данных в моей таблице, я не могу изменить структуру, я потеряю daa и время, чтобы сделать это, я пробую этот код и его почти работу, но все равно итого, не считая общих дней, я надеюсь, что кто-то поможет на этом последнем шаге.
Объявить @DayCount int =0
Объявить @DayCount2 int =0
Объявить @DayCount3 int =0
Объявить @DayCount4 int =0
Объявить @DayCount5 int =0
Объявить @DayCount6 int =0
Объявить @DayCount7 int =0
Объявить @Totsi int =0
ВЫБИРАТЬ
Дежурство,Суббота,
Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница,
(Случай, когда в субботу = 'M', то @все компоненты корпоративной сети +1 еще @компоненты корпоративной сети-энд) День1,
(Случай, когда воскресенье = 'M', то @DayCount2 +1 ELSE @DayCount2 END) Day2,
(Случай, когда Понедельник = 'M', то @DayCount3 +1 ELSE @DayCount3 END) Day3,
(Случай, когда вторник = 'M', то @DayCount4 +1 ELSE @DayCount4 END) Day4,
(Случай, когда среда = 'M', то @DayCount5 +1 ELSE @DayCount5 END) Day5,
(Случай, когда четверг = 'M', то @DayCount6 +1 ELSE @DayCount6 END) Day6,
(Случай, когда пятница = 'M', то @DayCount7 +1 ELSE @DayCount7 END) Day7,
Сумма(@DayCount + @DayCount2 + @DayCount3 +
@DayCount4 + @DayCount5 + @DayCount6 + @DayCount7) Суммы
Из MATRONDutyView
Группа По
Дежурство,Суббота,
Воскресенье,Понедельник,Вторник,Среда,Четверг,Пятница
ИМЕЮЩИЙ
DutyID < & gt; 1 ;

Wendelius

Обновлено решение, см. добавление 2

Wendelius

Обратите внимание, что в примере данных, который я использовал, вам не понадобится предложение SUM или GROUP BY, но это зависит от ваших данных, если они действительно нужны. Я включил их, потому что в исходном посте были как сумма, так и группа по

Member 11398913

я ценю вашу поддержку, благодарю всех вас за помощь...

Wendelius

Пожалуйста :)