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

Откуда:
Сообщений: 25
Запросом получаю такие данные.
FDatchikOB DT FCurrentValue AVG_TAR_VALUE HorizontalSpeed DELTADX FMessage FNormalValue
975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D 2011-12-08 04:00:04.000 456 0 6.112 0.0234337416530361 152646 0
7E661133-ECED-428F-9D51-FE77C85EF8B9 2011-12-08 04:00:04.000 726 5112 6.112 0.0234337416530361 152646 -1
975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D 2011-12-08 04:00:10.000 456 0 6.112 0.0234337416530361 152646 0
7E661133-ECED-428F-9D51-FE77C85EF8B9 2011-12-08 04:00:10.000 727 5112 6.112 0.0234337416530361152646 -1
975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D 2011-12-08 04:00:33.000 456 0 6.112 0.0234337416530361 152646 0
7E661133-ECED-428F-9D51-FE77C85EF8B9 2011-12-08 04:00:33.000 727 5112 6.112 0.0234337416530361 152646 -1
975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D 2011-12-08 04:00:40.000 456 0 6.112 0.0234337416530361 152646 0
7E661133-ECED-428F-9D51-FE77C85EF8B9 2011-12-08 04:00:40.000 727 5112 6.112 0.0234337416530361 152646 -1

Нужно FCurrentValue сгруппировать по двум датчикам. При этом один датчик не имеет значений (всегда ноль) в столбцах AVG_TAR_VALUE и FNormalValue, но и исключить эти столбцы не могу. Без них PIVOT работает как надо. С ними так:
DT AVG_TAR_VALUE HorizontalSpeed DELTADX FMessage FNormalValue MotorFCurrentValue
2011-12-08 04:00:04.000 0 6.112 0.0234337416530361 152646 0 456 NULL
2011-12-08 04:00:04.000 5112 6.112 0.0234337416530361 152646 -1 NULL 726
2011-12-08 04:00:10.000 0 6.112 0.0234337416530361 152646 0 456 NULL
2011-12-08 04:00:10.000 5112 6.112 0.0234337416530361 152646 -1 NULL 727
2011-12-08 04:00:33.000 0 6.112 0.0234337416530361 152646 0 456 NULL
2011-12-08 04:00:33.000 5112 6.112 0.0234337416530361 152646 -1 NULL 727
2011-12-08 04:00:40.000 0 6.112 0.0234337416530361 152646 0 456 NULL
2011-12-08 04:00:40.000 5112 6.112 0.0234337416530361 152646 -1 NULL 727

Хочу получить в таком виде:
DT AVG_TAR_VALUE HorizontalSpeed DELTADX FMessage FNormalValue FCurrentValue Motor
2011-12-10 04:00:19.000 5000 0 0.0440049480468009 213524 -1 634 456
2011-12-10 04:00:21.000 5000 0 0.0440049480468009 213524 -1 634 455
2011-12-10 04:00:49.000 5000 0 0.0440049480468009 213524 -1 633 456
2011-12-10 04:00:50.000 5000 0 0.0440049480468009 213524 -1 633 456


Собственно вот текст запроса:
SELECT DT,AVG_TAR_VALUE,HorizontalSpeed,DELTADX ,FMessage ,FNormalValue, [1] as FCurrentValue, [2] as Motor
 FROM (SELECT  FD.DT as DT,FD.FCurrentValue as FCurrentValue,FD.AVG_TAR_VALUE as AVG_TAR_VALUE,
               FM.HorizontalSpeed as HorizontalSpeed,FM.DELTADX as DELTADX,FM.FMessage as FMessage,FD.FNormalValue as FNormalValue, 
   case when FDatchikOB = @DATCHIK then 1
        when FDatchikOB = @DATCHIK2 then 2
        else null
        end as FDatchikOB                                 
 FROM  FMessageDetail FD (NOLOCK)
    JOIN FMessage FM (NOLOCK)ON FM.FMessage=FD.FMessage
 WHERE   FD.FDatchikOB IN (@DATCHIK,@DATCHIK2)                 
     AND FD.DT>=@DT_B AND FD.DT<@DT_E) AS SourceTable
PIVOT  ( sum(FCurrentValue)
       FOR FDatchikOB IN ([1],[2]))  AS PivotTable
ORDER BY DT 

Склоняюсь к тому что еще до PIVOT следует значения полей AVG_TAR_VALUE и FNormalValue с датчика имеющего значения скопировать на датчик не имеющий. Тогда PIVOT сработает как мне надо. Но что-то сообразить не могу.
13 дек 11, 15:17    [11757168]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
не хватает возможности PIVOT - попробуйте заменить его на что-то такое
select
...
,sum(case when FDatchikOB = @DATCHIK then FCurrentValue else 0 end) as [1]
,sum(case when FDatchikOB = @DATCHIK2 then FCurrentValue else 0 end) as [2]
...
from
...
13 дек 11, 16:17    [11757814]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
ДмитрийF
Member

Откуда:
Сообщений: 25
ничего не понял из примера кода, что он вообще делает?
13 дек 11, 17:21    [11758529]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
да практически то же что и pivot
declare @t table(FDatchikOB uniqueidentifier, DT datetime, FCurrentValue int)
insert @t values
('975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D', '20111208 04:00:04', 456),
('7E661133-ECED-428F-9D51-FE77C85EF8B9', '20111208 04:00:04', 726),
('975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D', '20111208 04:00:10', 456),
('7E661133-ECED-428F-9D51-FE77C85EF8B9', '20111208 04:00:10', 727)

declare @DATCHIK uniqueidentifier = '975C9022-9BEC-4F6E-AEE3-5FEFDCD7FA8D'
,@DATCHIK2 uniqueidentifier = '7E661133-ECED-428F-9D51-FE77C85EF8B9'

select
DT
,sum(case when FDatchikOB = @DATCHIK then FCurrentValue else 0 end) as [1]
,sum(case when FDatchikOB = @DATCHIK2 then FCurrentValue else 0 end) as [2]
from @t
group by DT

DT                      1           2
----------------------- ----------- -----------
2011-12-08 04:00:04.000 456         726
2011-12-08 04:00:10.000 456         727

(2 row(s) affected)
дальше наращивайте до нужного Вам функционала
13 дек 11, 17:30    [11758616]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
ДмитрийF
Member

Откуда:
Сообщений: 25
Вот спасибо!
Теперь понятно. Переделал, работает как надо. Ну не лень же таким дуракам как я разжевывать.
13 дек 11, 18:37    [11759249]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Паганель
не хватает возможности PIVOT - попробуйте заменить его на что-то такое
select
...
,sum(case when FDatchikOB = @DATCHIK then FCurrentValue else 0 end) as [1]
,sum(case when FDatchikOB = @DATCHIK2 then FCurrentValue else 0 end) as [2]
...
from
...
Кстати pivot работает медленнее, чем варинат приведеный Паганель.
14 дек 11, 11:22    [11762428]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Deff
Паганель
не хватает возможности PIVOT - попробуйте заменить его на что-то такое
select
...
,sum(case when FDatchikOB = @DATCHIK then FCurrentValue else 0 end) as [1]
,sum(case when FDatchikOB = @DATCHIK2 then FCurrentValue else 0 end) as [2]
...
from
...
Кстати pivot работает медленнее, чем варинат приведеный Паганель.
PIVOT вообще отстой! (я серьёзно)
14 дек 11, 11:53    [11762698]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Лучше б разработчики субд сделали встроенный нарастающий итог
14 дек 11, 11:55    [11762718]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Паганель
Лучше б разработчики субд сделали встроенный нарастающий итог
Я триггер написал. Работает сносно, подтормаживет если только начинают менять что-то задним числом.
Но если сделать клястерный индекс на ключ к нарастающему итогу, то тогда вообще красота.
14 дек 11, 11:58    [11762747]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Паганель
Лучше б разработчики субд сделали встроенный нарастающий итог
Так сделали!
Ждём SQL2012
14 дек 11, 12:02    [11762787]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Deff
Паганель
Лучше б разработчики субд сделали встроенный нарастающий итог
Я триггер написал. Работает сносно, подтормаживет если только начинают менять что-то задним числом.
Но если сделать клястерный индекс на ключ к нарастающему итогу, то тогда вообще красота.
я имел в виду sum(myfield) over(order by myfield2)
14 дек 11, 12:05    [11762812]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Паганель
Deff
пропущено...
Я триггер написал. Работает сносно, подтормаживет если только начинают менять что-то задним числом.
Но если сделать клястерный индекс на ключ к нарастающему итогу, то тогда вообще красота.
я имел в виду sum(myfield) over(order by myfield2)
Вот это и сделали!
14 дек 11, 12:08    [11762832]     Ответить | Цитировать Сообщить модератору
 Re: не хватает возможности PIVOT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
iap
Паганель
пропущено...
я имел в виду sum(myfield) over(order by myfield2)
Вот это и сделали!
это хорошо
14 дек 11, 12:13    [11762859]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить