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

Откуда:
Сообщений: 134
Здравствуйте.

Народ, немного запутался, подскажите решение или где его искать, что читать. Вот есть запрос из БД Оракла
SELECT   A.BEGINDATE,  A.ENDDATE,  a.KEYFIELD2,  SUM(A.DATAVALUE) KEEP DENSE_RANK LAST ORDER BY A.SUB_QUARTER)
FROM 
  SHELL_CORP_TRANSACTIONS A GROUP BY A.KEYFIELD2,A.BEGINDATE, A.ENDDATE;

Нужно спортировать в Сиквел. Я в сиквеле с ранжированием мало работал, помогите новичку.
Заранее благодарен.
10 сен 09, 16:38    [7643477]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Насколько я понял, Вам нужен Нарастающий итог
10 сен 09, 16:42    [7643513]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

Откуда:
Сообщений: 134
Вообще-то не совсем то.

Если я правильно понимаю задачу, то нужно получить сумму значений полей которые отранжированны по другому полю
10 сен 09, 16:55    [7643606]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ciget


Нужно спортировать в Сиквел. Я в сиквеле с ранжированием мало работал, помогите новичку.
Заранее благодарен.

А версию своего сервера новичок в состоянии сообщить ?
А результат, который выдавал этот запрос в Оракле ?
10 сен 09, 16:56    [7643616]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Ciget,

Давайте лучше вместо запроса на Oracle, который, как мне кажется синтаксически не правильный, выполните Рекомендации по оформлению сообщений в форуме п.6.
10 сен 09, 16:56    [7643617]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

Откуда:
Сообщений: 134
Glory
Ciget


Нужно спортировать в Сиквел. Я в сиквеле с ранжированием мало работал, помогите новичку.
Заранее благодарен.

А версию своего сервера новичок в состоянии сообщить ?
Oracle 10g Express Edition пытаюсь сконвертить в MS SQL 2005 Dev Edition

А результат, который выдавал этот запрос в Оракле ?

BEGINDATE ENDDATE KEYFIELD2 DATAVALUE

01.07.2006 01.10.2006 63.Indirect GHG from import energy 0
01.10.2006 01.01.2007 63.Indirect GHG from import energy 0
01.01.2007 01.04.2007 63.Indirect GHG from import energy 1352950,56089
01.01.2008 01.04.2008 63.Indirect GHG from import energy 486642,3
01.04.2008 01.07.2008 63.Indirect GHG from import energy 497546,5
01.07.2008 01.10.2008 63.Indirect GHG from import energy 544645
01.01.2004 01.04.2004 64.Indirect GHG from export energy 0
01.07.2007 01.10.2007 64.Indirect GHG from export energy 1720,7
01.01.2008 01.04.2008 64.Indirect GHG from export energy 1881,7
01.10.1996 01.01.1997 04.Hydrocarbon equivalent production 334429610,306565
01.10.1997 01.01.1998 04.Hydrocarbon equivalent production 312127571,108614
01.10.1998 01.01.1999 04.Hydrocarbon equivalent production 309218193,249234
01.01.2007 01.04.2007 04.Hydrocarbon equivalent production 75704285,5
01.04.2007 01.07.2007 04.Hydrocarbon equivalent production 65565056,1
01.07.2008 01.10.2008 04.Hydrocarbon equivalent production 65979731,5
01.10.1990 01.01.1991 62.Direct GHG emission in CO2 equivalent 74291961,606
01.10.1991 01.01.1992 62.Direct GHG emission in CO2 equivalent 83587037,938
10 сен 09, 17:01    [7643648]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

Откуда:
Сообщений: 134
pkarklin,
SELECT   A.BEGINDATE,  A.ENDDATE,  a.KEYFIELD2,  SUM(A.DATAVALUE) KEEP( DENSE_RANK LAST ORDER BY A.SUB_QUARTER)
FROM 
  SHELL_CORP_TRANSACTIONS A GROUP BY A.KEYFIELD2,A.BEGINDATE, A.ENDDATE;
10 сен 09, 17:03    [7643660]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

Откуда:
Сообщений: 134
Правильно будет сказать так, нужно получить запрос который получает сумму значений поля DATAVALUE среди максимальных значений поля SUB_QUARTER среди своего ранга.
10 сен 09, 17:08    [7643697]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Дока по ораклу гласит:
FIRST/LAST Functions
The FIRST/LAST aggregate functions allow you to rank a data set and work with its top-ranked or bottom-ranked rows.
After finding the top or bottom ranked rows, an aggregate function is applied to any desired column.
That is, FIRST/LAST lets you rank on column A but return the result of an aggregate applied on the first-ranked or last-ranked rows of column B.

This is valuable because it avoids the need for a self-join or subquery, thus improving performance.
These functions' syntax begins with a regular aggregate function (MIN, MAX, SUM, AVG, COUNT, VARIANCE, STDDEV) that produces a single return value per group.
To specify the ranking used, the FIRST/LAST functions add a new clause starting with the word KEEP.
Я взял на себя смелость выделить основную масль подчеркиванием,
а возможное решение - жирным курсивом
10 сен 09, 17:16    [7643745]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

Откуда:
Сообщений: 134
Ребят, пробывал по разному.
Возьмем конкретный привер. Есть таблица
CREATE TABLE [dbo].[TEST](
	[CITY] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
	[NAME] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
	[PERIOD] [int] NOT NULL,
	[GOODS] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
	[VAL] [int] NOT NULL
) ON [PRIMARY]

Дальше делаю коммит данных на которых будем тестировать:
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200605, 't00', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200607, 't01', 2); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200609, 't08', 3); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200603, 't01', 3); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200603, 't02', 2); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200605, 't03', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200612, 't05', 5); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n1', 200603, 't05', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n2', 200601, 't00', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n2', 200601, 't04', 23); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200603, 't03', 3); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200603, 't04', 4); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200603, 't01', 2); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200603, 't05', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200603, 't06', 2); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200604, 't00', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c1', 'n4', 200604, 't02', 6); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c2', 'n2', 200612, 't19', 4); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c2', 'n2', 200611, 't10', 2); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c2', 'n2', 200609, 't11', 1); 
INSERT INTO TEST ( CITY, NAME, PERIOD, GOODS, VAL ) VALUES ( 
'c2', 'n2', 200610, 't20', 8); 
COMMIT;


Теперь, в Оракле запрос отрабатывает нормально:
SELECT a.CITY, SUM(A.VAL) KEEP (DENSE_RANK FIRST ORDER BY A.NAME) FROM  DBST_TABL A GROUP BY A.CITY
а вот на сиквел перенести пробывал и с подзапросами ...

Как сделать так что бы в в каджом ранге (City) выбиралась первая или последняя группа по другой колонке (Name) и вычислялась сумма по другой колонке.
ПОмогите, ибо совсем запутался...
11 сен 09, 15:13    [7648231]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
итог -
для каждого city посчитать сумму в разрезе для каждого name ?
-------------------------------------
Jedem Das Seine
11 сен 09, 15:22    [7648310]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ciget


Как сделать так что бы в в каджом ранге (City) выбиралась первая или последняя группа по другой колонке (Name) и вычислялась сумма по другой колонке.
ПОмогите, ибо совсем запутался...

Результат для этих данных какой должен получиться ?
11 сен 09, 15:24    [7648327]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

CITY SUM(A.VAL)KEEP(DENSE_RANKFIRSTORDERBYA.NAME)

c1 18
c2 15
11 сен 09, 15:41    [7648487]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

Да, обсолютно верно
11 сен 09, 15:42    [7648491]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

но есть ньюанс - что бы была возможность выбора первой группы или последней колонки name суммировать
11 сен 09, 15:46    [7648519]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Glory
Member

Откуда:
Сообщений: 104760
SELECT a.CITY, SUM(A.VAL)
FROM  TEST A 
INNER JOIN (SELECT b.CITY, MIN(b.NAME) AS NAME FROM TEST B GROUP BY b.CITY) AS c ON c.CITY=a.CITY and b.NAME = a.NAME
GROUP BY A.CITY
11 сен 09, 15:51    [7648554]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

Мне кажеться что это не то, потому что если записей с одинаковыми именем и городом есть много .. тогда невозможно будет уникально идентифицировать записи ..
ON c.CITY=a.CITY and b.NAME = a.NAME
11 сен 09, 16:44    [7649003]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Glory
Member

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

Мне кажеться что это не то, потому что если записей с одинаковыми именем и городом есть много .. тогда невозможно будет уникально идентифицировать записи ..
ON c.CITY=a.CITY and b.NAME = a.NAME

ON c.CITY=a.CITY and с.NAME = a.NAME
11 сен 09, 16:47    [7649029]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

То я поправил.

Ок, сенкс главную идею понял.
11 сен 09, 18:53    [7649699]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

Ребят, вот только опять восстает проблема - нельзя идентифицировать запись при джоине по значениям нескольких полей ... был бы полезен ИД записи чтобы уникально ее проджоинить, но его нету .. какие в данном случае варианты ? row_number() ?
14 сен 09, 16:40    [7656638]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Ciget
нельзя идентифицировать запись при джоине по значениям нескольких полей
Это как?
У Вас в исходных данных присутствуют пары записей, неотличимых друг от друга?
И зачем этот дубляж?
14 сен 09, 16:44    [7656682]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Ciget,
что савсем савсем уникальность определить никак?
14 сен 09, 16:48    [7656710]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

В том то и дело что никак, я уже подуываю про генерацию уникальных записей ... мож есть варианты как переформулировать.

Все началось с того что значения на Оракловой БД и на Сиквеле - не совпадают ... вот это меня и натолкнуло на мысль ..что вполне вероятно...
Господа кто с опытом ... подскажите проверенный вариант.
14 сен 09, 17:04    [7656830]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Glory
Member

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

Ребят, вот только опять восстает проблема - нельзя идентифицировать запись при джоине по значениям нескольких полей ...

А что такое "идентификация при джойне" ?
14 сен 09, 17:06    [7656844]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать функции ранжирования с Оракла  [new]
Ciget
Member

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

По какому признаку джоинить запись к табличке
ON c.CITY=a.CITY and b.NAME = a.NAME
14 сен 09, 17:16    [7656912]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить