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

Откуда:
Сообщений: 54
Есть БД, из которой запрос

SELECT MyCard,MyDate,MyMarket,SUM(MySum) AS MySum
FROM MyTable
GROUP BY MyCard,MyDate,MyMarket
ORDER BY MyCard,MyDate,MyMarket

дает следующий результат:

MyCard	  MyDate   MyMarket MySum
001 01.01.2015 M002 3,45
001 01.01.2015 M003 5,32
001 03.01.2015 M003 6,43
001 03.01.2015 M005 2,00
001 03.01.2015 M005 8,21
002 02.01.2015 M001 3,22
002 04.01.2015 M002 5,76
002 04.01.2015 M003 7,93
002 06.01.2015 M003 9,44
002 07.01.2015 M003 3,67
002 07.01.2015 M004 5,65
003 03.01.2015 M004 4,34
003 03.01.2015 M004 7,55
003 03.01.2015 M005 8,77

Но результат нужен без повторяющихся значений полей MyCard,MyDate и MyMarket, т.е. в виде

MyCard	  MyDate   MyMarket MySum
001 01.01.2015 M002 3,45
M003 5,32
03.01.2015 6,43
M005 2,00
8,21
002 02.01.2015 M001 3,22
04.01.2015 M002 5,76
M003 7,93
06.01.2015 9,44
07.01.2015 3,67
M004 5,65
003 03.01.2015 4,34
7,55
M005 8,77

Запрос

SELECT
(CASE WHEN (ROW_NUMBER() OVER(PARTITION BY MyCard ORDER BY MyCard,MyDate,MyMarket))=1 THEN MyCard ELSE '' END) AS MyCard,
(CASE WHEN (ROW_NUMBER() OVER(PARTITION BY MyCard,MyDate ORDER BY MyCard,MyDate,MyMarket))=1 THEN MyDate ELSE NULL END) AS MyDate,
MyMarket,SUM(MySum) AS MySum
FROM MyTable
GROUP BY MyCard,MyDate,MyMarket

дает требуемый результат для полей MyCard,MyDate.
Никак не получается то же самое для поля MyMarket, т.е. это не страбатывает

(CASE WHEN (ROW_NUMBER() OVER(PARTITION BY MyCard,MyDate,MyMarket ORDER BY MyCard,MyDate,MyMarket))=1 THEN MyMarket ELSE NULL END) AS MyMarket.

Можно ли получить такой результат в принципе?
Буду благодарен за совет.
29 ноя 15, 19:06    [18488465]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с использованием ROW_NUMBER()  [new]
Макбет
Member

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

в вашем примере
MyCard	  MyDate   MyMarket MySum
001 01.01.2015 M003 5,32
001 03.01.2015 M003 6,43

MyCard	  MyDate   MyMarket MySum
001 01.01.2015 M002 3,45
M003 5,32
03.01.2015 6,43
M005 2,00

8,21
т.е. дубли MyMarket скрываются даже для разных дат
попробуйте убрать MyDate из PARTITION BY для MyMarket
(CASE WHEN (ROW_NUMBER() OVER(PARTITION BY MyCard,MyMarket ORDER BY MyCard,MyDate,MyMarket))=1 THEN MyMarket ELSE NULL END) AS MyMarket

p.s. если MyDate и MyMarket должны скрываться даже для разных MyCard - убирайте PARTITION BY совсем, оставляйте только сортировку
30 ноя 15, 10:33    [18490423]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с использованием ROW_NUMBER()  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
zago,

если это SQL 2012+, то возьмите функцию LAG и сбросьте в NULL значения, которые совпадают с предыдущей строкой.
30 ноя 15, 11:44    [18490971]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с использованием ROW_NUMBER()  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
автор
Но результат нужен без повторяющихся значений полей MyCard,MyDate и MyMarket, т.е. в виде

Данные в таком виде может предоставить отчетная система - reporting services или что-то иное.
30 ноя 15, 13:32    [18491803]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с использованием ROW_NUMBER()  [new]
zago
Member

Откуда:
Сообщений: 54
Макбет

К сожалению ни один из вариантов не сработал.

a_voronin

У нас SQL Server 2008
30 ноя 15, 19:24    [18494081]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с использованием ROW_NUMBER()  [new]
Rankatan
Member

Откуда:
Сообщений: 250
WITH T AS
(
	SELECT a,b,c,d,ROW_NUMBER() OVER(ORDER BY a,b,c,d) ord FROM
	(
		select  '001' a,'01.01.2015' b ,'M002' c ,'3,45'd
		UNION select  '001','01.01.2015','M003','5,32'  
		UNION select   '001','03.01.2015','M003','6,43'
		UNION select   '001','03.01.2015','M005','2,00'
		UNION select   '001','03.01.2015','M005','8,21'
		UNION select   '002','02.01.2015','M001','3,22'
		UNION select   '002','04.01.2015','M002','5,76'
		UNION select   '002','04.01.2015','M003','7,93'
		UNION select   '002','06.01.2015','M003','9,44'
		UNION select   '002','07.01.2015','M003','3,67'
		UNION select   '002','07.01.2015','M004','5,65'
		UNION select   '003','03.01.2015','M004','4,34'
		UNION select   '003','03.01.2015','M004','7,55'
		UNION select   '003','03.01.2015','M005','8,77'
	) Z
) 
SELECT distinct
	CASE WHEN T2.ord IS NULL then T1.a ELSE '' END,
	CASE WHEN T3.ord IS NULL then T1.b ELSE '' END,
	CASE WHEN T4.ord IS NULL then T1.c ELSE '' END,
	CASE WHEN T5.ord IS NULL then T1.d ELSE '' END,
	t1.ord
FROM T T1 
LEFT JOIN T T2 
	ON T1.ord>T2.ord AND T1.a=T2.a
LEFT JOIN T T3
	ON T1.ord>T3.ord AND T1.b=T3.b AND T1.a=T3.a
LEFT JOIN T T4
	ON T1.ord>T4.ord AND T1.c=T4.c AND T1.a=T4.a
LEFT JOIN T T5
	ON T1.ord>T5.ord AND T1.d=T5.d AND T1.a=T5.a
ORDER BY t1.ord
30 ноя 15, 22:17    [18494548]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить