Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
Имеется запрос, который выводит все позиции. Необходимо вывести только те, которые имею Да

SELECT RESOURCES.RESOURCENAME,
CASE
WHEN SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
)>0 THEN 'Нет'
ELSE 'Да'
END
FROM RESOURCES
LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
where CIRelationships.RELATIONSHIPTYPEID='7'
GROUP BY RESOURCES.RESOURCENAME
23 авг 16, 18:09    [19580581]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
msLex
Member

Откуда:
Сообщений: 9271
having SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
)>0
23 авг 16, 18:10    [19580588]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
Выводит те, которые имеют хотя бы 1 "да", а хотелось, чтобы все позиции были "да"
23 авг 16, 18:27    [19580645]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
msLex
Member

Откуда:
Сообщений: 9271
Vladsn07
Выводит те, которые имеют хотя бы 1 "да", а хотелось, чтобы все позиции были "да"

я не знаю что такое "позиции" и где у них "да".
23 авг 16, 18:36    [19580691]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
SoftwareInstallation.ATTRIBUTE_5701 имеют да или нет
23 авг 16, 18:50    [19580754]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
msLex
Member

Откуда:
Сообщений: 9271
having SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
) = count(*)
23 авг 16, 19:41    [19580931]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
stdvb
Member

Откуда:
Сообщений: 43
только, наоборот:
having SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
) = 0
23 авг 16, 19:51    [19580973]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
msLex
Member

Откуда:
Сообщений: 9271
stdvb
только, наоборот:
having SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
) = 0

ой, точно.
единички это же "нет"
23 авг 16, 19:54    [19580982]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
having SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 1
ELSE 0
END
) = 0


Выводит строку даже если есть одно да, а мне нужно, чтобы не выводил такие значения.
23 авг 16, 20:18    [19581095]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
msLex
Member

Откуда:
Сообщений: 9271
msLex
having SUM(CASE
WHEN SoftwareInstallation.ATTRIBUTE_5701='Нет' or SoftwareInstallation.ATTRIBUTE_5701 IS NULL THEN 0
ELSE 1
END
) = count(*)

вот так правильно
23 авг 16, 23:50    [19581991]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
o-o
Guest
having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)
24 авг 16, 00:00    [19582027]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
o-o
having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)


Выводит строку даже если есть одно да, а мне нужно, чтобы не выводил такие значения.
24 авг 16, 09:08    [19582610]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Vladsn07,

Зачем все эти суммы, кэйсы?
Чем не устраивает EXISTS()/NOT EXISTS()?
24 авг 16, 09:17    [19582653]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
o-o
Guest
Vladsn07
o-o
having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)


Выводит строку даже если есть одно да, а мне нужно, чтобы не выводил такие значения.

выводит строку, только если ВСЕ "да",
потому что если хоть в одной не "да", то count(*) насчитает больше sum()
24 авг 16, 09:38    [19582728]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
SELECT RESOURCES.RESOURCENAME
    	FROM RESOURCES
    	LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
        LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
    where CIRelationships.RELATIONSHIPTYPEID='7' AND NOT EXISTS (
    SELECT * FROM RESOURCES
    	LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
        LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
        WHERE SoftwareInstallation.ATTRIBUTE_5701='НЕТ' or SoftwareInstallation.ATTRIBUTE_5701 is NULL )
    GROUP BY RESOURCES.RESOURCENAME


вывод нет данных
24 авг 16, 09:39    [19582741]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
o-o
Vladsn07
пропущено...


Выводит строку даже если есть одно да, а мне нужно, чтобы не выводил такие значения.

выводит строку, только если ВСЕ "да",
потому что если хоть в одной не "да", то count(*) насчитает больше sum()


Не понял почему

SELECT RESOURCES.RESOURCENAME
    	FROM RESOURCES
    	LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
        LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
    where CIRelationships.RELATIONSHIPTYPEID='7'
    GROUP BY RESOURCES.RESOURCENAME
    having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)


Выводит правильный результат

А

SELECT RESOURCES.RESOURCENAME, SoftwareInstallation.ATTRIBUTE_5701
    	FROM RESOURCES
    	LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
        LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
    where CIRelationships.RELATIONSHIPTYPEID='7'
    GROUP BY RESOURCES.RESOURCENAME, SoftwareInstallation.ATTRIBUTE_5701
    having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)


не правильный
24 авг 16, 10:11    [19582865]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
o-o
Guest
Vladsn07
o-o
пропущено...

выводит строку, только если ВСЕ "да",
потому что если хоть в одной не "да", то count(*) насчитает больше sum()


Не понял почему

SELECT RESOURCES.RESOURCENAME
    	FROM RESOURCES
    	LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
        LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
    where CIRelationships.RELATIONSHIPTYPEID='7'
    GROUP BY RESOURCES.RESOURCENAME
    having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)


Выводит правильный результат

А

SELECT RESOURCES.RESOURCENAME, SoftwareInstallation.ATTRIBUTE_5701
    	FROM RESOURCES
    	LEFT JOIN CIRelationships ON RESOURCES.CIID = CIRelationships.CIID
        LEFT JOIN SoftwareInstallation ON CIRelationships.CIID2 = SoftwareInstallation.CIID
    where CIRelationships.RELATIONSHIPTYPEID='7'
    GROUP BY RESOURCES.RESOURCENAME, SoftwareInstallation.ATTRIBUTE_5701
    having SUM(CASE WHEN SoftwareInstallation.ATTRIBUTE_5701='Да' THEN 1 ELSE 0 END) = count(*)


не правильный

ну так какой смысл считать какие-то суммы и с каунтом сравнивать,
если вы группируете еще и по самому атрибуту?
вот пример, ресурс переименован в ид.
declare @t table(id int, attr varchar(3));
insert into @t values 
(1, 'да'),
(1,'нет'),
(2, 'да'),
(2, 'да');


select id, sum(case when attr='да' then 1 else 0 end) as sum_da, count(*) as cnt
from @t
group by id
having sum(case when attr='да' then 1 else 0 end) = count(*);
--------------
id	sum_da	cnt
2	2	2

select id, attr, sum(case when attr='да' then 1 else 0 end) as sum_da, count(*) as cnt
from @t
group by id, attr
having sum(case when attr='да' then 1 else 0 end) = count(*);
--------------
id	attr	sum_da	cnt
1	да	1	1
2	да	2	2

в первом случае, когда группировка идет по *ресурсу*,
сумма считает, сколько есть "да", а каунт, сколько всего строк *в группе ресурса*
(в этой группе значения атрибута могут быть "да", "нет", null.).
если совпадают, то ВСЕ строки иеют "да"
(число строк, потенциально могущих содержать все 3 значения,
совпадает с числом значений "да", ну так значит они все "да")

во втором случае (вообще бессмысленном) вы группируете еще и *по атрибуту*.
на каждый ресурс уже не 1 группа с тремя возможными значениями,
теперь могут быть все 3 группы: ресурс, да; ресурс, нет; ресурс, null.
ну так блин, если я посчитаю строки с "да" в такой группе, я отсею только группу "нет" и группу "null",
a в группе "да" и без того одни только "да", так что с чем сравнивать и что мне это даст?
24 авг 16, 10:46    [19583064]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
aleks2
Guest
iap
Vladsn07,

Зачем все эти суммы, кэйсы?
Чем не устраивает EXISTS()/NOT EXISTS()?


Они просто не понимают: ВСЕ "Да" = ни одного "Нет".

Вот и страдают фигней.
24 авг 16, 10:49    [19583080]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
o-o
Guest
aleks2
iap
Vladsn07,

Зачем все эти суммы, кэйсы?
Чем не устраивает EXISTS()/NOT EXISTS()?


Они просто не понимают: ВСЕ "Да" = ни одного "Нет".

Вот и страдают фигней.

нет, похоже, они пытались с not exists,
только они не понимают, что надо искать,
чтоб не было ни одного "нет" или налла
среди атрибутов *того же самого ресурса*.
они выше привели вариант с not exists,
где нет никакой связи между ресурсом в SELECT и ресурсом в WHERE NOT EXISTS
24 авг 16, 11:00    [19583145]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
o-o

Может вы и правы

Переделал скрипт на
SELECT RESOURCES.RESOURCENAME, DepartmentDefinition.DEPTNAME
FROM RESOURCES 
LEFT JOIN ResourceOwner ON RESOURCES.RESOURCEID=ResourceOwner.RESOURCEID 
LEFT JOIN ResourceAssociation ON ResourceOwner.RESOURCEOWNERID=ResourceAssociation.RESOURCEOWNERID 
LEFT JOIN DepartmentDefinition  ON ResourceOwner.DEPTID=DepartmentDefinition.DEPTID 
LEFT JOIN SoftwareInfo ON RESOURCES.RESOURCEID=SOFTWAREINFO.WORKSTATIONID  
LEFT JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID  
WHERE SoftwareList.SOFTWARETYPEID='2'    
GROUP BY RESOURCES.RESOURCENAME, DepartmentDefinition.DEPTNAME 
HAVING SUM(CASE WHEN SoftwareInfo.LICENSEID is not NULL THEN 1 ELSE 0 END) = count(*)


Без да и нет. Как выполнить через NOT EXISTS, т.е. нет ни одного SoftwareInfo.LICENSEID равное NULL у RESOURCES.RESOURCENAME?
25 авг 16, 09:11    [19587473]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
o-o
Guest
...
from RESOURCES r
...
where not exists ( select * FROM RESOURCES r1
 JOIN SoftwareInfo ON r1.RESOURCEID=SOFTWAREINFO.WORKSTATIONID  
WHERE r1.RESOURCEID = r.RESOURCEID and SoftwareInfo.LICENSEID is NULL)
25 авг 16, 09:42    [19587623]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
Вообще ни одного результата не выводит
25 авг 16, 10:13    [19587814]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
o-o
Guest
Да вы же отсебятину добавляете, нам не показываете, а потом жалуетесь.
До этого вы добавляли атрибут в группировку во все решения, что вам давали.
И сейчас наверняка что-то переделываете
25 авг 16, 10:19    [19587844]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
О-О
Последний мною добавленный скрипт - рабочий. От него я добавляю ваш код:

SELECT r.RESOURCENAME "Имя компьютера", DepartmentDefinition.DEPTNAME "Подразделение" 
FROM RESOURCES r
LEFT JOIN ResourceOwner ON r.RESOURCEID=ResourceOwner.RESOURCEID 
LEFT JOIN ResourceAssociation ON ResourceOwner.RESOURCEOWNERID=ResourceAssociation.RESOURCEOWNERID 
LEFT JOIN DepartmentDefinition  ON ResourceOwner.DEPTID=DepartmentDefinition.DEPTID 
LEFT JOIN SoftwareInfo ON r.RESOURCEID=SOFTWAREINFO.WORKSTATIONID  
LEFT JOIN SoftwareList ON SoftwareList.SOFTWAREID=SoftwareInfo.SOFTWAREID  
WHERE SoftwareList.SOFTWARETYPEID='2' AND  not exists (
 select * FROM RESOURCES r1
LEFT JOIN SoftwareInfo ON r1.RESOURCEID=SOFTWAREINFO.WORKSTATIONID  
WHERE r1.RESOURCEID = r.RESOURCEID and SoftwareInfo.LICENSEID is not NULL)
25 авг 16, 10:27    [19587892]     Ответить | Цитировать Сообщить модератору
 Re: SQL Запрос  [new]
Vladsn07
Member

Откуда: Российская Федерация
Сообщений: 105
последняя строчка без NOT

WHERE r1.RESOURCEID = r.RESOURCEID and SoftwareInfo.LICENSEID is NULL)
25 авг 16, 10:41    [19588002]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить