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

Скажите пожалуйста можно ли сделать такой запрос, чтобы он имел такой вид:


фрукты 01.01 02.01 03.01

бананы 1000 12000 3232
апельсины 233 3333 5555
томаты 443 43434 43344


Спасибо!
17 май 11, 08:40    [10662456]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
rush111,

select 'фрукты 01.01 02.01 03.01'
union all select 'бананы 1000 12000 3232'
union all select 'апельсины 233 3333 5555'
union all select 'томаты 443 43434 43344'
ну пожалуйста =)
если же проявить телепатические способности то может вы имели ввиду получить в качестве результата одного запроса записи которые отличаются количеситвом колонок и типам данных, то нет, так нельзя.
17 май 11, 08:45    [10662468]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111, читать на тему PIVOT и прочих кросстабов.
* Оформление вопроса, действительно, не очень....
17 май 11, 08:48    [10662477]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
qwerty112
Guest
SomewhereSomehow
ну пожалуйста =)

5 !
17 май 11, 08:50    [10662487]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
kDnZP,

я читал что достойных pivot запросов в sql нет
17 май 11, 08:55    [10662513]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111, не беда, пишите недостойные.
Я PIVOT никак освоить не могу, синтаксис просто наглухо убивает. Через 5 минут все забываю. Так что по старинке - агрегаты с кейсами))).
17 май 11, 08:58    [10662522]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
iljy
Member

Откуда:
Сообщений: 8711
rush111,

declare @t table (Fruit varchar(30), dt date, Num int)
insert @t values
('бананы', '20110101', 1000),
('бананы', '20110102', 12000),
('бананы', '20110103', 3232),
('апельсины', '20110101', 233),
('апельсины', '20110102', 3333),
('апельсины', '20110103', 5555),
('томаты', '20110101', 443),
('томаты', '20110102', 43434),
('томаты', '20110103', 43344)

select * from @t pivot
(max(Num) for dt in ([20110101],[20110102],[20110103])) p
17 май 11, 09:09    [10662556]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
iljy,

спасибо! отсюда и буду копать. если у кого есть какие идеи еще присылайте :))

Спасибо еще раз !
17 май 11, 09:11    [10662559]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111,

Ну раз iljy не поленился, то и от меня держите:
SELECT  t.Fruit [Фрукты],
        MAX(CASE WHEN t.dt = '20110101' THEN t.num
            END) [01.01],
        MAX(CASE WHEN t.dt = '20110102' THEN t.num
            END) [02.01],
        MAX(CASE WHEN t.dt = '20110103' THEN t.num
            END) [03.01]
FROM    @t t
GROUP BY t.Fruit
17 май 11, 09:37    [10662667]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
kDnZP,

а то такое @t?

Если не трудно нормальный create table :)
а то я запутался :(

чтобы я создал в sql таблицу
17 май 11, 15:45    [10665491]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111, э... Дык вроде жеж вверху все есть. @t - табличная переменная.

declare @t table (Fruit varchar(30), dt date, Num int)
insert @t values
('бананы', '20110101', 1000),
('бананы', '20110102', 12000),
('бананы', '20110103', 3232),
('апельсины', '20110101', 233),
('апельсины', '20110102', 3333),
('апельсины', '20110103', 5555),
('томаты', '20110101', 443),
('томаты', '20110102', 43434),
('томаты', '20110103', 43344)

SELECT  t.Fruit [Фрукты],
        MAX(CASE WHEN t.dt = '20110101' THEN t.num
            END) [01.01],
        MAX(CASE WHEN t.dt = '20110102' THEN t.num
            END) [02.01],
        MAX(CASE WHEN t.dt = '20110103' THEN t.num
            END) [03.01]
FROM    @t t
GROUP BY t.Fruit

Если у вас сервак ниже 2008, то типа такого
declare @t table (Fruit varchar(30), dt datetime, Num int)
insert @t (Fruit, dt, Num)
select 'бананы', '20110101', 1000 union all
select 'бананы', '20110102', 12000 union all
select 'бананы', '20110103', 3232 union all
select 'апельсины', '20110101', 233 union all
select 'апельсины', '20110102', 3333 union all
select 'апельсины', '20110103', 5555 union all
select 'томаты', '20110101', 443 union all
select 'томаты', '20110102', 43434 union all
select 'томаты', '20110103', 43344
17 май 11, 16:06    [10665745]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
kDnZP,

Все супер. но проблема в том что вы всегда прописываете даты.

а если я не знаю какие у меня даты?

можно сделать так, чтобы они автоматом ставились?

у меня сейчас так:

при запросе

select * from [3442].[dbo].[tab] pivot
(max(Num) for dt in ([20110101],[20110102],[20110103])) p

Fruit 20110101 20110102 20110103
апельсины 233 3333 5555
арьбузы NULL NULL NULL
бананы 1000 12000 3232
томаты 443 43434 43344


а если делать простой select

dt Fruit Num
2011-01-01 00:00:00.000 бананы 1000
2011-01-02 00:00:00.000 бананы 12000
2011-01-03 00:00:00.000 бананы 3232
2011-01-01 00:00:00.000 апельсины 233
2011-01-02 00:00:00.000 апельсины 3333
2011-01-03 00:00:00.000 апельсины 5555
2011-01-01 00:00:00.000 томаты 443
2011-01-02 00:00:00.000 томаты 43434
2011-01-03 00:00:00.000 томаты 43344
2003-02-01 00:00:00.000 бананы 434
2003-02-02 00:00:00.000 бананы 269
2003-02-03 00:00:00.000 бананы 348
2003-02-04 00:00:00.000 бананы 422
2003-02-05 00:00:00.000 бананы 277
2003-02-06 00:00:00.000 бананы 278
2003-02-07 00:00:00.000 бананы 384
2003-02-08 00:00:00.000 бананы 296
2003-02-09 00:00:00.000 апельсины 378
2003-02-10 00:00:00.000 апельсины 401
2003-02-11 00:00:00.000 апельсины 275
2003-02-12 00:00:00.000 апельсины 423
2003-02-13 00:00:00.000 апельсины 404
2003-02-14 00:00:00.000 апельсины 265
2003-02-15 00:00:00.000 апельсины 257
2003-02-16 00:00:00.000 апельсины 243
2003-02-17 00:00:00.000 апельсины 306
2003-02-18 00:00:00.000 апельсины 378
2003-02-19 00:00:00.000 апельсины 244
2003-02-20 00:00:00.000 апельсины 234
2003-02-21 00:00:00.000 апельсины 363
2003-02-22 00:00:00.000 арьбузы 230
2003-02-23 00:00:00.000 арьбузы 408
2003-02-24 00:00:00.000 арьбузы 392
2003-02-25 00:00:00.000 арьбузы 252
2003-02-26 00:00:00.000 арьбузы 241
2003-02-27 00:00:00.000 арьбузы 357
2003-02-28 00:00:00.000 арьбузы 250
2003-03-01 00:00:00.000 арьбузы 355
2003-03-02 00:00:00.000 арьбузы 341
2003-03-03 00:00:00.000 арьбузы 401
2003-03-04 00:00:00.000 арьбузы 253
2003-03-05 00:00:00.000 арьбузы 231
2003-03-06 00:00:00.000 арьбузы 347
2003-03-07 00:00:00.000 арьбузы 419
17 май 11, 16:24    [10665942]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111, т.е. вы не знаете сколько у вас столбцев будет или что?
Из вашей портянки - что должно быть на выходе? Выборка в разрезе 3х дней первого месяца? Зх дней каждого месяца? Или все дни всего месяца?
17 май 11, 16:28    [10665982]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
kDnZP,

я думаю стоит выбрать все дни из всех месяцев и лет, а потом условиями выбирать нужные.

Спасибо Вам за помощь :)
17 май 11, 16:31    [10665999]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
rush111,


мне кажется что то вроде такого
select *
from [3442].[dbo].[tab]

pivot
(max(Num) for dt in (data <01.01.01 and >01.01.99 )) p
17 май 11, 16:32    [10666012]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
rush111
rush111,


мне кажется что то вроде такого
select *
from [3442].[dbo].[tab]

pivot
(max(Num) for dt in (data <01.01.01 and >01.01.99 )) p

Сервер за вас подсчитывать число столбцов в результате не будет
Как и давать им имена.
Все это придется делать вам
И одним запросом не получится
17 май 11, 16:35    [10666029]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
Glory,

n/t если у меня данные за года я должен ввести 365 таких значений? "[20110103]"
17 май 11, 16:36    [10666041]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
rush111
Glory,

n/t если у меня данные за года я должен ввести 365 таких значений? "[20110103]"

Ага и найти пользователя-мазохиста, который будет эту "простыню" листать вправо-влево
17 май 11, 16:38    [10666060]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111, т.е. за 10 лет вы ожидаете получить в худшем случае ~3650 столбцев? Серверу от такого поплохеет.
Но в любом случае (в разумных пределах) - динамикой реализовать все возможно. Пример нужен?
Если да - то завтра напомните, т.к. рабочий день к концу подходит))).
17 май 11, 16:38    [10666064]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
rush111
Guest
kDnZP,

ДА был бы очень признателен.

К сожалению эксель не справляется с задачами. приходиться учить sql :))

С удовольствием посмотрел бы на динамические запросы
17 май 11, 16:43    [10666107]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
kDnZP
rush111, т.е. за 10 лет вы ожидаете получить в худшем случае ~3650 столбцев? Серверу от такого поплохеет.
Но в любом случае (в разумных пределах) - динамикой реализовать все возможно. Пример нужен?
Если да - то завтра напомните, т.к. рабочий день к концу подходит))).
Однако, есть куда расти!
SQL 2008 разрешает 4096 полей в одном SELECTе!
http://msdn.microsoft.com/ru-ru/library/ms143432(v=SQL.100).aspx
17 май 11, 16:51    [10666183]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
rush111
kDnZP,

ДА был бы очень признателен.

К сожалению эксель не справляется с задачами. приходиться учить sql :))

С удовольствием посмотрел бы на динамические запросы


Вы что пытаетесь на коленке изобрести ОЛАП с квадратными колесами?
17 май 11, 16:55    [10666213]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
iljy
Member

Откуда:
Сообщений: 8711
rush111,

посмотрите. Но это реально мазохизм, причем слабоосмысленный.
17 май 11, 16:59    [10666242]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
rush111, ну за 4 минуты до уходу домой для примеру такое придумал:
create table #t (Fruit varchar(30), dt datetime, Num int)
insert #t (Fruit, dt, Num)
select 'бананы', '20110101', 1000 union all
select 'бананы', '20110102', 12000 union all
select 'бананы', '20110103', 3232 union all
select 'апельсины', '20110101', 233 union all
select 'апельсины', '20110102', 3333 union all
select 'апельсины', '20110103', 5555 union all
select 'томаты', '20110101', 443 union all
select 'томаты', '20110102', 43434 union all
select 'томаты', '20110103', 43344 union all
select 'грибы', '19800101', 12345


DECLARE @ssql VARCHAR(max)
SET @ssql='select * from #t pivot (max(Num) for dt in ('
SELECT @ssql=@ssql+'['+REPLACE((
SELECT  t.cn AS [data()]
FROM    ( SELECT DISTINCT
                    CONVERT(VARCHAR(10), dt, 112) cn
          FROM      #t
        ) t
ORDER BY t.cn
FOR     XML PATH('')
),' ','],[')+']'
SET @ssql=@ssql+')) p'

PRINT @ssql
EXEC(@ssql)
DROP TABLE #t
Попробуйте запросу скормить данных поболе,
17 май 11, 17:06    [10666317]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
s.w.a.n.
Member

Откуда: Москва
Сообщений: 137
rush111,
как вариант
create table #t (Fruit varchar(30), dt datetime, Num int)
insert #t (Fruit, dt, Num)
select 'бананы', '20110101', 1000 union all
select 'бананы', '20110101', 1000 union all
select 'бананы', '20110101', 1000 union all
select 'бананы', '20110102', 12000 union all
select 'бананы', '20110103', 3232 union all
select 'апельсины', '20110101', 233 union all
select 'апельсины', '20110102', 3333 union all
select 'апельсины', '20110103', 5555 union all
select 'томаты', '20110101', 443 union all
select 'томаты', '20110102', 43434 union all
select 'томаты', '20110103', 43344 union all
select 'грибы', '19800101', 12345


DECLARE @ssql VARCHAR(max)
DECLARE @cc VARCHAR(max)

SET @cc = ''

SELECT @cc = @cc + '[' + vd + '], '
FROM
(SELECT DISTINCT CONVERT(VARCHAR(10), dt, 121) vd FROM #t) x

SET @cc=LEFT(@cc, LEN(@cc)-1)

SELECT @ssql = 'SELECT * FROM #t
PIVOT (sum(Num) FOR dt IN (' + @cc + ')) as pt'

PRINT @ssql
EXEC(@ssql)
DROP TABLE #t
17 май 11, 17:49    [10666785]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить