Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
MonoQuad
Member

Откуда: Kiev
Сообщений: 11
Добрый день!
Это усложненная задача, которая была ранее (вроде как и удалось решить, но возникла новая проблема):
https://www.sql.ru/forum/1162487/ms-sql-agregaciya-s-raznymi-usloviyami-dlya-svedeniya-v-odnu-tablicu

Для того, чтобы описать проблему с которой столкнулся на работе в начале своих разгребаний с SSRS2012 я предлагаю такой пример (в любой базе):

CREATE TABLE dbo.Students
(
FullName nvarchar(40) NOT NULL,
Sex bit NOT NULL,
Age smallint NOT NULL,
Balance money NOT NULL DEFAULT 0
)
GO

INSERT INTO dbo.Students
(FullName, Sex, Age, Balance)
Values
('Alex Morgan', 1, 21, -15.00),
('Thomas Rand', 1, 16, 300.00),
('Helen Hudson', 0, 18, 157.00),
('Olga Stomp', 0, 25, -2.00),
('Polina Kiseleva', 0, 17, 240.00),
('Olga Stomp', 0, 25, -10.00)

--Olga Stomp повторяется два раза, хотя это одна и та же студентка

SELECT * FROM dbo.Students

--Задача состоит в том, чтобы посчитать общее кво студентов и одновременно посчитать посчитать, сколько их имеет отрицательный баланс - всё это сгруппировать по полу
--Как ни крутил запрос, пытался сделать вложенный - ничего не получалось, получалось только два отдельных запроса:
SELECT Sex, Count (DISTINCT FullName) as 'Кво (общ)'
FROM Students
GROUP BY Sex

SELECT DISTINCT Sex, Count(DISTINCT FullName) as 'Кво (отр. баланс)'
FROM Students
WHERE Balance < 0
GROUP By Sex


--В первом запросе подсчитываются все студенты по полу, во втором - только те, которые имеют отрицательный баланс.
--Но для вывода в отчётe SSRS нужен один. Также думал, что в Reporting Services, можно попробовать сделать, но там два запроса приходится разбивать на два разных источника данных и программа ругается, что можно использовать только один.
--На выходе нужна вот такая таблица:
--Sex Кво (общ) Кво (отр. баланс)
--0 3 1
--1 2 1

--предлагалось пользователями invm и ЦБ следующее решение:
SELECT Sex, Count (*) as 'Кво (общ)',
sum(case when Balance < 0 then 1 else 0 end) as 'Кво (отр. баланс)'
FROM Students
GROUP BY Sex

--но оно работает только тогда, когда имена студентов не повторяются, но, к сожалению, в данном случае записи задублированы
--Прошу помочь разобраться...
--Заранее благодарю!
23 июн 15, 10:07    [17805140]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
o-o
Guest
declare @Students table
(
FirstName nvarchar(15) NOT NULL,
LastName nvarchar(15) NOT NULL,
Sex bit NOT NULL,
Age smallint NOT NULL,
Balance money NOT NULL DEFAULT 0
);

INSERT INTO @Students
(FirstName, LastName, Sex, Age, Balance)
Values
('Alex', 'Morgan', 1, 21, -15.00),
('Thomas', 'Rand', 1, 16, 300.00),
('Helen', 'Hudson', 0, 18, 157.00),
('Olga', 'Stomp', 0, 25, -2.00),
('Polina', 'Kiseleva', 0, 17, 240.00)
INSERT INTO @Students
(FirstName, LastName, Sex, Age, Balance)
Values
('Olga', 'Stomp', 0, 25, -10.00);

with cte as
(
select FirstName, LastName, Sex, Age, sum(Balance) as Balance
from @Students
group by FirstName, LastName, Sex, Age
)


SELECT Sex, Count (*) as 'Кво (общ)',
 sum(case when Balance < 0 then 1 else 0 end) as 'Кво (отр. баланс)'
FROM cte
GROUP BY Sex
23 июн 15, 10:26    [17805249]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
MonoQuad
Member

Откуда: Kiev
Сообщений: 11
o-o,

но ведь это работает при введении данных, а данные то уже введены
23 июн 15, 11:35    [17805600]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4900
НА SQL2012 пора начинать писать

IIF(Balance < 0, 1, 0) 


вместо

case when Balance < 0 then 1 else 0 end
23 июн 15, 12:10    [17805903]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
Кролик-зануда
Guest
a_voronin,

Это, видимо, даст прирост производительности в 50%?
23 июн 15, 12:13    [17805936]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
a_voronin
НА SQL2012 пора начинать писать

IIF(Balance < 0, 1, 0) 



вместо

case when Balance < 0 then 1 else 0 end
Это с каких грибов?
IIF - это для тех, кто переходит на MSSQL с Access, а перучиваться лень

CASE - это стандарт.
23 июн 15, 12:13    [17805939]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
MonoQuad
o-o,

но ведь это работает при введении данных, а данные то уже введены

переведите плиз ,что в итоге сказать то хотели ?
23 июн 15, 12:17    [17805960]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
o-o
Guest
Maxx,

желають сказать, что оне не в состоянии @Students на dbo.Students заменить.
мне не жалко
+
;with cte as
(
select FirstName, LastName, Sex, Age, sum(Balance) as Balance
from dbo.Students
group by FirstName, LastName, Sex, Age
)

SELECT Sex, Count (*) as 'Кво (общ)',
 sum(IIF(Balance < 0, 1, 0) ) as 'Кво (отр. баланс)'
FROM cte
GROUP BY Sex

но сейчас начнется, что балансы складывать нехорошо,
и если там у Ольги балансы -10 и +25, то считать ее все равно надо, так что ответ неверный.
короче, вечно то в партию вступишь, то в ...
23 июн 15, 12:23    [17806012]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL Агрегация с разными условиями для сведения в одну таблицу+  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
o-o
желають сказать, что оне не в состоянии @Students на dbo.Students заменить.
мне не жалко

не ну разве к вам был вопрос уважаемый Мыж вроде не первый день знакомы то
23 июн 15, 13:13    [17806386]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить