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

Откуда:
Сообщений: 10
у меня есть табличка MyTabl. в ней поля есть Data, FIO, ID

я ее преобразую к виду, показанного ниже:

declare @s varchar(max)
set @s = ''

select top 1 with ties @s = isnull(@s + ', ', '') + ' case convert(date,m.Data) when '''+ convert(char,convert(date,m.Data)) +''' then m.ID else null end [' +convert(char,convert(date,m.Data))+ ']' +char(10) 
from MyTabl as m where convert(date,m.Data) is not null order by row_number() over (partition by convert(date,m.Data) order by convert(date,m.Data))

select @s = 'select m.FIO' + char(10) + @s + 'from MyTabl as m'

print @s
exec (@s)

результат:

      FIO                  2010-4-5       2010-4-6      2010-4-7
 1     Зорин А.П.         NULL             4b546           NULL
 2     Алешев А.Л.      NULL              NULL            lkjh45
 3     Мухин Р.Э.        f34m5            NULL             NULL
 4     Зорин А.П.         NULL             NULL             lsd7d

как сделать, чтобы если одна и таже фамилия группировались по датам в 1 строку?
чтобы было вот так:

        FIO                  2010-4-5       2010-4-6      2010-4-7
 1     Зорин А.П.         NULL             4b546           lsd7d
 2     Алешев А.Л.      NULL              NULL            lkjh45
 3     Мухин Р.Э.        f34m5            NULL             NULL
30 июн 11, 21:12    [10902824]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Liionna, max(case...) ... group by FIO
уже не работает?
30 июн 11, 21:21    [10902846]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
kDnZP
Liionna, max(case...) ... group by FIO
уже не работает?


т.е? зачем max и куда группировать? я что-то торможу...
30 июн 11, 21:26    [10902874]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Liionna, а как вы группировку без агрегата делать будете? Вам жеш свернуть нужно данные.
Ну и раз вы тестовые данные с таблицами делать не хотите, то хоть покажите итоговый скрипт динамики, который у вас принт выдает.
30 июн 11, 21:30    [10902899]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
вот как-то так... помоги, пожалуйста...


set nocount on



create table #MyTabl(Data datetime, FIO varchar(50), ID varchar(50))
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-26 03:04:04.527','Зорин А.П.','25022807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Алешевич А.Л.','52807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-25 03:04:04.527','Мухин Р.Э.','45607-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Зорин А.П.','8622807-A77')

declare @s varchar(max)
set @s = ''

select top 1 with ties @s = isnull(@s + ', ', '') + ' case convert(date,m.Data) when '''+ convert(char,convert(date,m.Data)) +''' then m.ID else null end [' +convert(char,convert(date,m.Data))+ ']' +char(10) 
from #MyTabl as m where convert(date,m.Data) is not null order by row_number() over (partition by convert(date,m.Data) order by convert(date,m.Data))

select @s = 'select m.FIO' + char(10) + @s + 'from #MyTabl as m'


print @s
exec (@s)

drop table #MyTabl
30 июн 11, 22:07    [10903102]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
мне надо, чтобы у Зорин А.П. значения были в 1 строке...
30 июн 11, 22:09    [10903106]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

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

set nocount on



create table #MyTabl(Data datetime, FIO varchar(50), ID varchar(50))
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-26 03:04:04.527','Зорин А.П.','25022807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Алешевич А.Л.','52807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-25 03:04:04.527','Мухин Р.Э.','45607-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Зорин А.П.','8622807-A77')

declare @s varchar(max)
set @s = ''

select top 1 with ties @s = isnull(@s + ', ', '') + ' max(case convert(date,m.Data) when '''+ convert(char,convert(date,m.Data)) +''' then m.ID else null end) [' +convert(char,convert(date,m.Data))+ ']' +char(10) 
from #MyTabl as m where convert(date,m.Data) is not null order by row_number() over (partition by convert(date,m.Data) order by convert(date,m.Data))

select @s = 'select m.FIO' + char(10) + @s + 'from #MyTabl as m group by m.FIO'


print @s
exec (@s)

drop table #MyTabl
?
30 июн 11, 22:14    [10903117]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
спасибки!!!!!

только еще 1 маленький вопросик.... у меня некоторые фамилии не имеют значения даты...а в поле ID находиться "НЕТ" и надо по всем тогда датам вставлять "НЕТ"... не получается через convert(date,m.Data)<>' '

примерно что должно быть:

  FIO                  2010-4-5       2010-4-6      2010-4-7
 1     Зорин А.П.         NULL             4b546           lsd7d
 2     Алешев А.Л.      NULL              NULL            lkjh45
 3     Мухин Р.Э.        f34m5            NULL             NULL
 4     Кролик П.О.      НЕТ                НЕТ              НЕТ

таблица вот такая:
create table #MyTabl(Data datetime, FIO varchar(50), ID varchar(50))
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-26 03:04:04.527','Зорин А.П.','25022807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Алешевич А.Л.','52807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-25 03:04:04.527','Мухин Р.Э.','45607-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Зорин А.П.','8622807-A77')
insert into #MyTabl(Data , FIO , ID ) VALUES ('','Кролик Р.А.','Нет')
30 июн 11, 22:25    [10903140]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Liionna, что, сессия негаданно нагрянула?

Вот, чуть переписал ваш вариант, чтобы он покрасивше был:
SELECT
        @s = ISNULL(@s + ', ', '') + ' max(case CONVERT(VARCHAR(10), m.Data, 112) when ''' + CONVERT(VARCHAR(10), MAX(m.DATA), 112) + ''' then m.ID else null end) [' + CONVERT(VARCHAR(10), m.Data,120) + ']' + CHAR(10)
FROM    #MyTabl AS m
WHERE   Data IS NOT NULL
GROUP BY m.Data
ORDER BY m.Data
Остальное самостоятельно.
30 июн 11, 22:50    [10903202]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
сессия сдана на отлично =) уже 1,5 недели тому... =) нас как-то не оч гоняют с sql =) универ мой что-то слабенько и поверхностно учит...

в оригинале там немного другие данные)) вместо фамилии - ID магазина)) столбцы там идут номер недели+ _ +номер дня, а не дата)) а вместо ID - значения хрени всякой)) отчетеГ вообщем..

просто я не знаю как вписать во все даты еще этот "НЕТ"... типо по данному магазину вообще никакой отчетности нет..
мозг болит... помоги, пожалуйста... а то до завтра надо написать... а мозг уже взорван...
30 июн 11, 23:18    [10903284]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Liionna, ну ведь дурите же меня доверчевого. 100%
declare @s varchar(max)
set @s = ''
declare @s2 varchar(max)
set @s2 = ''

SELECT
        @s = CASE WHEN NOT m.Data='19000101' THEN ISNULL(@s + ', ', '') + ' max(case CONVERT(VARCHAR(10), m.Data, 112) when ''' + CONVERT(VARCHAR(10), MAX(m.DATA), 112) + ''' then m.ID end) [' + CONVERT(VARCHAR(10), m.Data,120) + ']' + CHAR(10) ELSE
        ISNULL(@s + ', ', '') + ' max(case CONVERT(VARCHAR(10), m.Data, 112) when ''19000101'' then m.ID end) [f]' + CHAR(10) END,
        @s2 = CASE WHEN NOT m.Data='19000101' THEN ISNULL(@s2 + ', ', '') +  + 'isnull(t.[' + CONVERT(VARCHAR(10), m.Data,120) + '],t.f) AS [' + CONVERT(VARCHAR(10), m.Data,120) + ']' + CHAR(10) ELSE '' END
FROM    #MyTabl AS m
WHERE   m.Data IS NOT NULL
GROUP BY m.Data
ORDER BY m.Data
select @s = 'select ROW_NUMBER() OVER (ORDER BY t.FIO) rn, t.FIO'+ char(10)+@s2+' from (select m.FIO' + char(10) + @s + 'from #MyTabl as m group by m.FIO) t'


print @s
exec (@s)
30 июн 11, 23:45    [10903371]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
Спасибки)

Зачем мне Вас дурить? Могу сфоткать зачетку и переслать) у меня закончилась временно учеба) "каникулы" до сентября)

что-то запросег показывает ошибку...

Сообщение 1038, уровень 15, состояние 4, строка 2
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name.

loading....
30 июн 11, 23:59    [10903426]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Liionna, я прежде чем сюда записать проверил. Запрос рабочий. Покажите что сформировал print @s в динамике.
1 июл 11, 00:02    [10903434]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Вот что формируется на ваших тестовых данных:
select ROW_NUMBER() OVER (ORDER BY t.FIO) rn, t.FIO
, isnull(t.[2010-10-25],t.f) AS [2010-10-25]
, isnull(t.[2010-10-26],t.f) AS [2010-10-26]
, isnull(t.[2010-10-27],t.f) AS [2010-10-27]
 from (select m.FIO
,  max(case CONVERT(VARCHAR(10), m.Data, 112) when '19000101' then m.ID end) [f]
,  max(case CONVERT(VARCHAR(10), m.Data, 112) when '20101025' then m.ID end) [2010-10-25]
,  max(case CONVERT(VARCHAR(10), m.Data, 112) when '20101026' then m.ID end) [2010-10-26]
,  max(case CONVERT(VARCHAR(10), m.Data, 112) when '20101027' then m.ID end) [2010-10-27]
from #MyTabl as m group by m.FIO) t
1 июл 11, 00:04    [10903437]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
ой... работает)) только...

когда

set nocount on

тогда не работает) а мне эта строчка надо) спасибки за помощь!!! Буду разбираться)
1 июл 11, 00:10    [10903451]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Liionna, неа, не в том беда. Мой косяк. Терь верно.

set nocount on



create table #MyTabl(Data datetime, FIO varchar(50), ID varchar(50))
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-26 03:04:04.527','Зорин А.П.','25022807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Алешевич А.Л.','52807-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-25 03:04:04.527','Мухин Р.Э.','45607-A27')
insert into #MyTabl(Data , FIO , ID ) VALUES ('2010-10-27 03:04:04.527','Зорин А.П.','8622807-A77')
--insert into #MyTabl(Data , FIO , ID ) VALUES ('','Кролик Р.А.','Хренасдва')

declare @s varchar(max)
set @s = ''
declare @s2 varchar(max)
set @s2 = ''

SELECT
        @s = CASE WHEN NOT m.Data='19000101' THEN ISNULL(@s + ', ', '') + 'max(case CONVERT(VARCHAR(10), m.Data, 112) when ''' + CONVERT(VARCHAR(10), MAX(m.DATA), 112) + ''' then m.ID end) [' + CONVERT(VARCHAR(10), m.Data,120) + ']' + CHAR(10) ELSE
        ISNULL(@s + ', ', '') + 'max(case CONVERT(VARCHAR(10), m.Data, 112) when ''19000101'' then m.ID else null end) [f]' + CHAR(10) END,
        @s2 = CASE WHEN NOT m.Data='19000101' THEN ISNULL(@s2 + ', ', '') +  + 'isnull(t.[' + CONVERT(VARCHAR(10), m.Data,120) + '],t.f) [' + CONVERT(VARCHAR(10), m.Data,120) + ']' + CHAR(10) ELSE '' END
FROM    #MyTabl AS m
WHERE   m.Data IS NOT NULL
GROUP BY m.Data
ORDER BY m.Data
SELECT @s=CASE WHEN CHARINDEX('[f]',@s)>0 THEN @s ELSE @s+', NULL [f] ' END
select @s = 'select ROW_NUMBER() OVER (ORDER BY t.FIO) rn, t.FIO' + char(10) + @s2 + ' from (select m.FIO' + char(10) + @s + 'from #MyTabl as m group by m.FIO) t'


print @s
exec (@s)

drop table #MyTabl
1 июл 11, 00:20    [10903468]     Ответить | Цитировать Сообщить модератору
 Re: Строки и столбцы  [new]
Liionna
Member

Откуда:
Сообщений: 10
=) ОГРОМНОЕ СПАСИБО!
1 июл 11, 00:34    [10903508]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить