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

Откуда:
Сообщений: 12
Необходимо вывести отчет по половозрастному распределению. в исходной таблице указаны даты рождения и пол.
в приложенном файле выходная форма.

К сообщению приложен файл. Размер - 5Kb
18 июл 11, 14:29    [10989533]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
Glory
Member

Откуда:
Сообщений: 104751
И в чем конкретная проблема ?
18 июл 11, 14:30    [10989544]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
И в чем сложность???
18 июл 11, 14:31    [10989560]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Declare @T Table (y int, p bit)

-- 0 M  1 W

Insert Into @T
Select 15, 0
union
Select 4, 1
union
Select 65, 0
union
Select 8, 0
union
Select 9, 1
union
Select 19, 1
union
Select 23, 0
union
Select 36, 1
union
Select 11, 1

Select 
sum(case when y<=4 and p=0 then 1 else 0 end) as [M 0-4],
sum(case when y<=4 and p=1 then 1 else 0 end) as [W 0-4],
sum(case when y>4 and y<=17 and p=0 then 1 else 0 end) as [M 5-17],
sum(case when y>4 and y<=17 and p=1 then 1 else 0 end) as [W 5-17]

from @T

Select * from @T

???
18 июл 11, 14:40    [10989632]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
ImrDuke
Member

Откуда:
Сообщений: 12
angel_zar
Declare @T Table (y int, p bit)

-- 0 M  1 W

Insert Into @T
Select 15, 0
union
Select 4, 1
union
Select 65, 0
union
Select 8, 0
union
Select 9, 1
union
Select 19, 1
union
Select 23, 0
union
Select 36, 1
union
Select 11, 1

Select 
sum(case when y<=4 and p=0 then 1 else 0 end) as [M 0-4],
sum(case when y<=4 and p=1 then 1 else 0 end) as [W 0-4],
sum(case when y>4 and y<=17 and p=0 then 1 else 0 end) as [M 5-17],
sum(case when y>4 and y<=17 and p=1 then 1 else 0 end) as [W 5-17]

from @T

Select * from @T

???


не могу разобраться что к чему тут описано... никогда не имел еще дел с динамическими запросами
18 июл 11, 15:43    [10990054]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
ImrDuke
не могу разобраться что к чему тут описано... никогда не имел еще дел с динамическими запросами

Да? А где вы тут нашли динамический запрос?
18 июл 11, 15:45    [10990068]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
ImrDuke
Member

Откуда:
Сообщений: 12
Точнее выходная табличка должна выглядеть так

К сообщению приложен файл. Размер - 10Kb
18 июл 11, 15:51    [10990119]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
ImrDuke, читать тут.
18 июл 11, 15:56    [10990155]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
Орлы_летают_одиноко
Guest
ДДН ?

По вопросу:

Допустим, имеем t1(IDFirm int, Sex tinyint, DateBirth datetime)

IDFirm - Код фирмы
Sex - (1-мужчины, 2-Женщины)

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

Select IDFirm,
sum(case when Sex=1 and (year(DateBirth) between 0 and 4) then 1 end) M1,
sum(case when Sex=2 and (year(DateBirth) between 0 and 4) then 1 end) W1,
sum(case when Sex=1 and (year(DateBirth) between 5 and 17) then 1 end) M2,
sum(case when Sex=2 and (year(DateBirth) between 5 and 17) then 1 end) W2,
sum(case when Sex=1 and (year(DateBirth) between 18 and 59) then 1 end) M3,
sum(case when Sex=2 and (year(DateBirth) between 18 and 54) then 1 end) W3,
sum(case when Sex=1 and (year(DateBirth) >=60) then 1 end) M4,
sum(case when Sex=2 and (year(DateBirth) >=55) then 1 end) W4
from t1 group by IDFirm
20 июл 11, 12:37    [10999445]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Орлы_летают_одиноко
ДДН ?

По вопросу:

Допустим, имеем t1(IDFirm int, Sex tinyint, DateBirth datetime)

IDFirm - Код фирмы
Sex - (1-мужчины, 2-Женщины)

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

Select IDFirm,
sum(case when Sex=1 and (year(DateBirth) between 0 and 4) then 1 end) M1,
sum(case when Sex=2 and (year(DateBirth) between 0 and 4) then 1 end) W1,
sum(case when Sex=1 and (year(DateBirth) between 5 and 17) then 1 end) M2,
sum(case when Sex=2 and (year(DateBirth) between 5 and 17) then 1 end) W2,
sum(case when Sex=1 and (year(DateBirth) between 18 and 59) then 1 end) M3,
sum(case when Sex=2 and (year(DateBirth) between 18 and 54) then 1 end) W3,
sum(case when Sex=1 and (year(DateBirth) >=60) then 1 end) M4,
sum(case when Sex=2 and (year(DateBirth) >=55) then 1 end) W4
from t1 group by IDFirm


У вас возраст равен году рождения, прям все какие то бессмертные
20 июл 11, 13:10    [10999707]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
Орлы_летают_одиноко
Guest
Простите, не совсем понял о бессмертии :). А как будет правильнее ?
20 июл 11, 13:24    [10999786]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
Орлы_летают_одиноко
Guest
Черт, я понял...вот, балбес-то.

Не year(DateBirth), а datediff(yyyy,DateBirth,DD), где DD - некая дата расчета.
20 июл 11, 13:32    [10999834]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Орлы_летают_одиноко
Черт, я понял...вот, балбес-то.

Не year(DateBirth), а datediff(yyyy,DateBirth,DD), где DD - некая дата расчета.


datediff(yyyy,DateBirth,GetDate())

Наверное так, но автор куда то пропал, если честно, ему скорее нужно в раздел работа
20 июл 11, 13:37    [10999873]     Ответить | Цитировать Сообщить модератору
 Re: Отчет половозрастное распределение.  [new]
ImrDuke
Member

Откуда:
Сообщений: 12
никуда я не пропал, просто то что требовалось удалось реализовать
select Company_RUS.Q_NAME as Name,
sum(case when Lpu.W='1' and (floor((CURRENT_date -Lpu.dr)/365.25) BETWEEN 0 AND 4) then 1 else 0 end) as M0_4,
sum(case when Lpu.W='2' and (floor((CURRENT_date -Lpu.dr)/365.25) BETWEEN 0 AND 4) then 1 else 0 end) as W0_4,
sum(case when Lpu.W='1' and (floor((CURRENT_date -Lpu.dr)/365.25) BETWEEN 5 AND 17) then 1 else 0 end) as M5_17,
sum(case when Lpu.W='2' and (floor((CURRENT_date -Lpu.dr)/365.25) BETWEEN 5 AND 17) then 1 else 0 end) as W5_17,
sum(case when Lpu.W='1' and (floor((CURRENT_date -Lpu.dr)/365.25) BETWEEN 18 AND 59) then 1 else 0 end) as M18_59,
sum(case when Lpu.W='2' and (floor((CURRENT_date -Lpu.dr)/365.25) BETWEEN 18 AND 54) then 1 else 0 end) as W18_54,
sum(case when Lpu.W='1' and (floor((CURRENT_date -Lpu.dr)/365.25) > 60) then 1 else 0 end) as M60,
sum(case when Lpu.W='2' and (floor((CURRENT_date -Lpu.dr)/365.25) > 55) then 1 else 0 end) as W55
from lpu
INNER JOIN Company_RUS ON Lpu.Q_OGRN=Company_RUS.Q_OGRN
WHERE (Company_RUS.TF_OKATO='61000')
group by Company_RUS.Q_NAME
21 июл 11, 14:44    [11007079]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить