Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 12.02.2012
Сообщений: 45
1

Как правильно обработать отсутствие данных?

01.07.2016, 13:17. Показов 662. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
помогите пожалуйста начинающему мне есть вот такой вот скриптик написанный мною.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
ALTER PROCEDURE dbo.BALLEGE 
    @SID INT,
    @FYEAR INT,
    @LYEAR INT
AS
 
SELECT
    SB.name AS subj,
    SUM(CASE 
        WHEN E.value=5
            THEN 1 
            ELSE 0 END) AS cnt5,
    SUM(CASE 
        WHEN E.value=4
            THEN 1
            ELSE 0 END) AS cnt4,
    SUM(CASE 
        WHEN E.value=3
            THEN 1
            ELSE 0 END) AS cnt3,
    SUM(CASE 
        WHEN E.value=2
            THEN 1
            ELSE 0 END) AS cnt2,
    SUM(CASE 
        WHEN E.value=1
            THEN 1
            ELSE 0 END) AS cnt1,
    avg(E.Value*1.0) AS GPA
FROM
    person P
    INNER JOIN exam E ON P.ID=E.ID_Person
    INNER JOIN subject SB ON SB.id=E.ID_Subject
 
WHERE
    YEAR(E.Date_Exam)<=@LYEAR
AND YEAR(E.Date_Exam)>=@FYEAR
AND P.ID_School=@SID  --отсеивание школ апосредовано через учеников учащихся в них и сдававших экзамены
GROUP BY
    SB.name
UNION
SELECT
    'ИТОГ' AS subj,
    SUM(CASE 
        WHEN E.value=5
            THEN 1
            ELSE 0 END) AS cnt5,
    SUM(CASE 
        WHEN E.value=4
            THEN 1
            ELSE 0 END) AS cnt4,
    SUM(CASE 
        WHEN E.value=3
            THEN 1
            ELSE 0 END) AS cnt3,
    SUM(CASE 
        WHEN E.value=2
            THEN 1
            ELSE 0 END) AS cnt2,
    SUM(CASE 
        WHEN E.value=1
            THEN 1
            ELSE 0 END) AS cnt1,
    avg(E.Value*1.0) AS GPA
FROM
    person P
    INNER JOIN exam E ON P.ID=E.ID_Person
WHERE
    YEAR(E.Date_Exam)<=@LYEAR
AND YEAR(E.Date_Exam)>=@FYEAR
AND P.ID_School=@SID   --отсеивание школ апосредовано через учеников учащихся в них и сдававших экзамены
ORDER BY
    cnt5
он подтягивает кол-во каждой из оценок по каждому из предметов. вопрос в том что хочется ещё сделать фильтр по школе. точнее, хочется при отсутвии указания школы (@SID NULL) это условие игнорилась и бралась статистика по всем школам. самое лобовое решение это ещё в начале процедуры проанализировать этот @SID и просто два скрипта написать отличающихся лишь наличием/отсутствием условия проверки школы. но нифига же так некрасиво. Есть какие-то более изящные методы решения? была идея попытаться выгрузить в какой-нить массив все ID школ если искомый не указан, но SQL не знает массивов как таковых, тем более динамических (ведь хз сколько у нас школ), курсоры сюда тоже не привертеть вроде бы. Вот. не то чтобы решения прошу, прошу сказать это вообще адекватными методами решается? (под адекватностью понимать что этот скрипт писался не больше часа значит и решение проблемы д.б. не более затратно, да и машину нагружать не больше)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2016, 13:17
Ответы с готовыми решениями:

Как обработать отсутствие элемента в Selenium?
произвожу поиск элемента в selenium, как обработать если не находит элемент и выполнить другой...

Правильно обработать поток данных
Допустим пользователь вводит строку типа: &quot;A build 3 : 2,3,2 : 1,2,3,4,5,6,7,8,9,10,11,12&quot;. Мне...

Как правильно обработать сообщение?
не получается получить и обработать сообщение о считывании штрихкода сканером: в InitInstance()...

Как обработать правильно время
Добрый день. Подскажите как правильно в js обработать такой формат даты &quot;PT9H&quot;, &quot;PT9H30M&quot;, чтобы...

7
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
01.07.2016, 13:33 2
(P.ID_School=@SID or @SID is NULL)
как вариант
0
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 18
01.07.2016, 15:44 3
Нормальный у вас скрипт.
Очень не рекомендую использовать курсоры без крайней необходимости (они очень медленные, но есть задачи с которыми только они справляются)
про массивы уже давно забыл , использую таблицы или склеиваю строку через разделитель.

собственно Null - это тоже наличие данных (тот кто сдает может нигде и не учится - не числится , вариантов куча , можно привязать конкретное место где сдавал и т.д. )

мне тоже на вскидку только такой вариант приходит:
Цитата Сообщение от pincet Посмотреть сообщение
and (P.ID_School=@SID or @SID is NULL)
как вариант
вы кстати в ID используете GUID ? (если нет , то рекомендую использовать , очень упрощает жизнь ,ведь данных может быть очень много и контролировать уникальность очень не просто)
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
01.07.2016, 16:08 4
Цитата Сообщение от code hunter Посмотреть сообщение
ведь данных может быть очень много и контролировать уникальность очень не просто
Даже интересно стало - как GUID помогает контролировать уникальность данных, когда этих данных много?
А много - это сколько?
0
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
01.07.2016, 16:09 5
Цитата Сообщение от code hunter Посмотреть сообщение
вы кстати в ID используете GUID ? (если нет , то рекомендую использовать
зарадидля?
0
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 18
04.07.2016, 07:36 6
Про GUID много написано уже ,
может конечно он занимает больше места и теоретически медленнее работает(у меня все нормально работает)
,но по крайней мере GUID уникальный (вероятность его совпадения крайне мала в пределах одной машины) .
Вот другой вопрос что под уникальными ключами могут быть одинаковые записи(дубли) например неправильно занесенные данные , но БД от этого не поплохеет.
Мне например удобно выстраивать связь многие ко многим, что бы не плодить кучу таблиц со связями , я использую одну, в ней (GUID,GUID_Object1,GUID_Object2)- здесь только PK , две последние колонки подразумевают FK , но не связаны так как объектами могут быть строки в разных таблицах.

Я не навязываю его использовать ,а все го лишь высказываю свое видение , а использовать его вам или нет это ваше дело и выбор (в маленьких БД может лучше и простой id (int ) использовать или вообще строчку ключом сделать ).

А какие вы ключи используете в своих таблицах? , поделитесь, будет полезно знать



PS. у меня объем примерно такой : несколько сотен таблиц и в каждой от 2-x до нескольких миллионов записей , в среднем по несколько тысяч на таблицу.
0
3499 / 2083 / 742
Регистрация: 02.06.2013
Сообщений: 5,078
04.07.2016, 11:59 7
Цитата Сообщение от code hunter Посмотреть сообщение
по крайней мере GUID уникальный
Уникальность гарантируется ограничением уникальности или уникальным индексом и никак не зависит от типа столбца.
Цитата Сообщение от code hunter Посмотреть сообщение
Мне например удобно выстраивать связь многие ко многим, что бы не плодить кучу таблиц со связями , я использую одну, в ней (GUID,GUID_Object1,GUID_Object2)
Про ссылочную целостность не будем, т.к., скорее всего, аргумент "мне так удобно" перешибет любые конраргументы?
А что получится, если некий Obect1 может соотносится с несколькими Object2?
Цитата Сообщение от code hunter Посмотреть сообщение
А какие вы ключи используете в своих таблицах? , поделитесь, будет полезно знать
GUID разумно использовать в качестве ключа, когда в одной БД консолидируются данные из внешних источников. Хороший пример - merge репликация.
В остальных случаях у него нет никаких преимуществ над числовыми ключами.
0
1 / 1 / 1
Регистрация: 30.01.2013
Сообщений: 18
05.07.2016, 15:57 8
У каждого своя правда )
Я вас прекрасно понимаю.
Я когда пришел на работу мне связки (GUID,GUID_Object1,GUID_Object2)без ключей (связи контролируются только триггерами и умами создателей) казались дикостью и мой мозг взрывался, и я всячески пытался уговорить использовать реальные внешние ключи , но так как у нас БД уже давно вышла за рамки реляционной, то естественно я уже ни на что не мог повлиять)
Цитата Сообщение от invm Посмотреть сообщение
А что получится, если некий Obect1 может соотносится с несколькими Object2
На это и рассчитано , бывает еще похлеще Object-ов не ограничено , но есть некоторые правила, нельзя вот так просто взять и связать два объекта , это все регламентируется.

После перехода на GUID теперь вообще не представляю как без него обходится.

Ну как бы в таблицах первичные ключи у меня естественно индексы уникальные (просто по дефолту я не высчитываю ключ или не использую автоинкримент, у меня там newid() )
0
05.07.2016, 15:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2016, 15:57
Помогаю со студенческими работами здесь

Как правильно обработать ошибку?
здравствуйте, есть такая проблема. есть три таблицы и одним кликам делается запрос, проблема в том...

Как правильно обработать исключение?
public String HttpURLConnection(int position){ org.jsoup.nodes.Document doc = null;...

Как правильно обработать массив?
Добрый вечер, помогите плиз, никак не могу понять, как правильно. есть массив, который...

Как правильно обработать onTouchListener
В моем коде обработчик прикосновений работает как onClickListener. Помогите исправить. Нужно...

Как правильно обработать столкновения?
Во время каждой итерации игрового цикла у меня происходит проверка всех пар объектов на коллизию....

Как правильно обработать исключение ?
В событии FormCreate читаем путь к директории из ini-файла , и когда там путь к дисководу , а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru