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

Откуда:
Сообщений: 21
Доброго времени суток.
Есть некий набор данных упрощенно он может выглядеть так:
имя тип сумма
альфа г 50
альфа н 140
бета г 70
гамма н 200
дельта г 150

необходимо привести это к такому виду

имя тип г тип н
альфа 50 140
бета 70 0
гамма 0 200
дельта 150 0
11 май 15, 12:00    [17625103]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Funy
необходимо привести это к такому виду
JOIN набора данных сам на себя (можно с CTE), либо PIVOT
11 май 15, 12:03    [17625110]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
В таблице большое количество записей (35000 в месяц) и вот этот join сам к себе сильно увеличит время выполнения этого запроса?
11 май 15, 12:22    [17625151]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Glory
Member

Откуда:
Сообщений: 104760
GROUP BY + CASE или PIVOT
11 май 15, 12:23    [17625156]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
а инструкция PIVOT в данном случае как будет выглядеть?
11 май 15, 12:42    [17625189]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Funy
а инструкция PIVOT в данном случае как будет выглядеть?

https://www.google.ee/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=pivot mssql
11 май 15, 12:47    [17625201]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
Окей я погуглю)) И еще вопрос - одно из полей в записи содержит в себе количество минут. Какой тип данных оптимальнее будет указать, при создании таблицы, если есть вероятность что по этому полю будет что то считаться?
11 май 15, 13:22    [17625260]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Funy
Какой тип данных оптимальнее будет указать, при создании таблицы, если есть вероятность что по этому полю будет что то считаться?

Ну конечно же image
Во-первых, в бинарном поле можно хранить все, что угодно
Во-вторых, максимальный размер поля 2Гб. Т.е. всего, что угодно, можно хранить еще и много.
11 май 15, 13:31    [17625282]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
Отсыпь немного))) я тоже хочу позабористей курнуть
11 май 15, 13:54    [17625333]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Funy
Отсыпь немного))) я тоже хочу позабористей курнуть

Продолжайте курить то, что вы курили, когда задавали вопрос.
11 май 15, 14:01    [17625345]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
Сколько желчи))) Вы аккуратнее, здоровье дороже. Вопрос может и простой, и даже банальный, но не ужели так сложно ответить. В бд под это поле (минуты) у меня определен тип данных nvarchar, и если мне необходимо сгруппировать это поле то нужно будет что то типа sum(cast(int,%name%)) вот я и спрашиваю есть ли смысл переопределять таблицу. Если всех на googl'ы посылать то зачем существует форум, для теребоньканья ЧСВ?
11 май 15, 19:44    [17626154]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Funy
Вопрос может и простой, и даже банальный, но не ужели так сложно ответить
Вопрос действительно зачётный :-)
Раз вы выбрали для хранения числа тип "строка", то предположение Glory о image уже не выглядит фантастическим. А что, в виде картинки хранить хорошо, вдруг руководство в отчёте захочет число минут разными цветами показывать? :-)
Funy
Если всех на googl'ы посылать то зачем существует форум, для теребоньканья ЧСВ?
Нежели вы серьёзно думаете, что ответ на ваш вопрос можно найти в гугле???
Funy
В бд под это поле (минуты) у меня определен тип данных nvarchar, и если мне необходимо сгруппировать это поле то нужно будет что то типа sum(cast(int,%name%)) вот я и спрашиваю есть ли смысл переопределять таблицу.
Разумеется, для хранения числа нужно выбрать числовой тип. А какой именно - нужно выбрать исходя из ваших требований, тут вам никто помочь не сможет.

Например, нужно ли хранить целые числа, или дробные, если дробные, то с какой точностью, точное представление или приблизительное. Если целые, то какой диапазон значений может быть (если это минуты часа, то достаточно tinyint, а если вы храните периоды в тысячилетия в минутах, то используйте bigint)
11 май 15, 22:11    [17626522]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
o-o
Guest
alexeyvg
Разумеется, для хранения числа нужно выбрать числовой тип

все издеваетесь, и никто не оценит глубину мысли, а ведь все подсказки уже даны:
видите же, не просто строковый тип выбран, а nvarchar.
числа же состоят из цифр, это трудно отрицать.
римские цифры приходится на латыни набирать, а арабские на арабском.
тут на форуме недавно проскакивало, что 2014-ый сервер уже знает русские цифры
но тут засада: наберешь неюникодом, другой сервер может за английские принять
11 май 15, 23:12    [17626710]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2385
Блог
o-o,

Русские - это с титлами что ли?
12 май 15, 07:36    [17626958]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
o-o
числа же состоят из цифр, это трудно отрицать.
Как, а "сумма прописью"?
12 май 15, 09:08    [17627122]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
мда... всем спасибо за участие. Хорошо что хоть развеселил))). Ну мопэд не мой, в каком виде импортировали из Excel в таком и досталось. По первоначальному сабжу:

select name,(
select SUM(cost) from table tt2
where
tt1.name = tt2.name and
tt2.tip ='Г'

) as Г,(

select SUM(cost) from table tt3
where
tt1.name = tt3.name and
tt3.tip ='Н'

) as Н

from table tt1
group by name

Позже будет решение с case или pivot, если для дальнейшей задачи это потребуется.
Что касается типов данных, задача проста - без лишних танцев с бубнами и приведениями типов, необходимо агрегировать эти данные.
13 май 15, 01:37    [17631793]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
Funy
мда... всем спасибо за участие. Хорошо что хоть развеселил))). Ну мопэд не мой, в каком виде импортировали из Excel в таком и досталось.


мопэд теперь ваш раз достался по наследству, и вопросы вы задаетё и чтоб не веселить народ надо хоть основы почитать

Funy
Что касается типов данных, задача проста - без лишних танцев с бубнами и приведениями типов, необходимо агрегировать эти данные.

чтоб агрегировать данные вам уже сказали что тип должен быть числовой
int,float,money,decimal(20,2),...любой удовлетворяющий требованиям точности

alter table [table] alter column cost int


По первоначальному сабжу:

select name
,SUM(case when tip ='Г' then cost else 0 end) as [Г]
,SUM(case when tip ='Н' then cost else 0 end) as [Н]
from table 
group by name
13 май 15, 07:07    [17631943]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
Funy
Member

Откуда:
Сообщений: 21
Спасибо за участие с case'ом опередили)))) для агрегации числовой тип, тут тоже все ясно. Но я зашел в тупик со временем.
В таблице есть несколько полей где фигурирует продолжительность звонка. Так вот эту самую продолжительность звонка мне и нужно где то агрегировать, где то еще работать, высчитывать. При импорте из excel'я никакой тип данных из (date, datetime и тд) не удается использовать, и связано это, скорее всего, с тем что в этом поле есть значения вида xx:xx (len(xx:xx) будет равен 8) и вида x:xx:xx (len(x:xx:xx) будет равен 7) то есть они не однородны для приведения типа я хз.

Что я пытался сделать.
втупую подзапросом
select
case
when len(ltrim(кл_длит)) = 5 then cast(substring(ltrim(кл_длит),1,2) as int)
when len(ltrim(кл_длит)) = 7 then cast(substring(ltrim(кл_длит),1,1)as int)*60+cast(substring(ltrim(кл_длит),3,2) as int) else 0 end)) as minut

все бы хорошо, но это пипец как громоздко, да и при оборачивание всей этой простыни в sum() ничего не работает.
Пробывал написать функцию, но в функции пока не разобрался (по отдельности работает, все в месте - в case'ах уходит в else и все тут.
--CREATE FUNCTION dbo.test1(@n1 nvarchar)
--RETURNS INT
--BEGIN
-- DECLARE @n2 int
-- select @n2 =
-- CASE
-- WHEN len(ltrim(@n1)) = 5 THEN cast(substring(ltrim(@n1),1,2) as int)
-- WHEN len(ltrim(@n1)) = 7 THEN cast(substring(ltrim(@n1),1,1) as int)*60 + cast(substring(ltrim(@n1),3,2) as int)
-- WHEN len(ltrim(@n1)) = 8 THEN cast(substring(ltrim(@n1),1,2) as int)*60 + cast(substring(ltrim(@n1),4,2) as int)
-- ELSE -1
-- END
-- return (@n2)
--END;
select dbo.test1('14:00');
-1

В итоге подскажите с направлением куда копать или заморачиваться и переделывать формат исходных данных, что бы иметь возможность использовать встроенный функционал(datediff, например), или же писать свою функцию со всеми потрохами. Или что почитать =)
21 май 15, 03:40    [17669508]     Ответить | Цитировать Сообщить модератору
 Re: Два запроса в одну строчку.  [new]
alter function
Guest
Funy,

alter FUNCTION dbo.test1(@n1 nvarchar(10))
21 май 15, 19:08    [17673272]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить