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

Откуда:
Сообщений: 13
Добрый день!
Есть результат выборки в таком виде:

Описание Значение Дата
А 503.8 2017-12-20 08
Б 0 2017-12-20 08
С 3 2017-12-20 08
А 717.4 2017-12-20 09
Б 0 2017-12-20 09
С 9.3 2017-12-20 09
А 1281.9 2017-12-20 10
Б 0 2017-12-20 10
С 29.6 2017-12-20 10
А 1058.4 2017-12-20 11
Б 0 2017-12-20 11
С 15.9 2017-12-20 11

Вопрос - Можно ли сделать выборку из этой, с группировкой по времени и в результате такое:

Дата Описание Значение Описание Значение Описание Значение
2017-12-20 08 А 503.8 Б 0 С 3
2017-12-20 09 A 717.4 Б 0 С 9.3

и так для каждой даты

Спасибо за любые советы!
21 дек 17, 11:42    [21051115]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
sirus_christus,
может тебе на самом деле нужно вот так?
ДатаАБС
2017-12-20 08503.803
2017-12-20 09717.409.3
21 дек 17, 11:47    [21051149]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
sirus_christus
Member

Откуда:
Сообщений: 13
Руслан Дамирович, да , пожалуй тупанул я. Вы абсолютно правы

Дата А Б С
2017-12-20 08 503.8 0 3
2017-12-20 09 717.4 0 9.3


именно то, что нужно
21 дек 17, 11:54    [21051189]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Руслан Дамирович
может тебе на самом деле нужно вот так?

Оба варианта делаются через PIVOT.
21 дек 17, 11:57    [21051205]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
2008+: PIVOT
DECLARE @tbl TABLE (
  [text] VARCHAR(1),
  [value] MONEY,
  [stamp] VARCHAR(15) )
INSERT INTO @tbl
VALUES
( 'А',	503.8,	'2017-12-20 08' ),
( 'Б',	0,		'2017-12-20 08' ),
( 'С',	3,		'2017-12-20 08' ),
( 'А',	717.4,	'2017-12-20 09' ),
( 'Б',	0,		'2017-12-20 09' ),
( 'С',	9.3,		'2017-12-20 09' ),
( 'А',	1281.9,	'2017-12-20 10' ),
( 'Б',	0,		'2017-12-20 10' ),
( 'С',	29.6,		'2017-12-20 10' ),
( 'А',	1058.4,	'2017-12-20 11' ),
( 'Б',	0,		'2017-12-20 11' ),
( 'С',	15.9,		'2017-12-20 11' )
;
SELECT
  *
FROM
  @tbl t
  PIVOT (
    SUM( [value] )
    FOR [text] IN ( [А], [Б], [С] )
  ) pvt
;
21 дек 17, 12:01    [21051229]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
sirus_christus
Member

Откуда:
Сообщений: 13
Руслан Дамирович, спасибо работает!

Но что если описания А, Б, С динамически меняются в предыдущей выбоке и я явно не знаю их?
21 дек 17, 12:15    [21051282]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
sirus_christus
Руслан Дамирович, спасибо работает!

Но что если описания А, Б, С динамически меняются в предыдущей выбоке и я явно не знаю их?

тогда динамически и скрипт собирать.
21 дек 17, 12:16    [21051288]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
sirus_christus
Но что если описания А, Б, С динамически меняются в предыдущей выбоке и я явно не знаю их?


Тогда так:

IF OBJECT_ID('tempdb..#my_list') IS NOT NULL DROP TABLE #my_list
CREATE TABLE #my_list (
  [Описание]  nvarchar(30),
  [Значение]  decimal(24,2),
  [Дата]      nvarchar(30),
)
CREATE INDEX temp_my_idx ON #my_list ([Описание], [Дата])

INSERT #my_list ([Описание], [Значение], [Дата])
VALUES
( 'А',	503.8,	'2017-12-20 08' ),
( 'Б',	0,		'2017-12-20 08' ),
( 'С',	3,		'2017-12-20 08' ),
( 'А',	717.4,	'2017-12-20 09' ),
( 'Б',	0,		'2017-12-20 09' ),
( 'С',	9.3,	'2017-12-20 09' ),
( 'А',	1281.9,	'2017-12-20 10' ),
( 'Б',	0,		'2017-12-20 10' ),
( 'С',	29.6,	'2017-12-20 10' ),
( 'А',	1058.4,	'2017-12-20 11' ),
( 'Б',	0,		'2017-12-20 11' ),
( 'С',	15.9,	'2017-12-20 11' )

DECLARE
  @column_list nvarchar(max),
  @sql_str nvarchar(max)

SELECT @column_list=COALESCE(@column_list+',['+[Описание]+']', '['+[Описание]+']')
FROM #my_list GROUP BY [Описание] ORDER BY [Описание]

SELECT @sql_str='SELECT * FROM #my_list PIVOT ( SUM([Значение] ) FOR [Описание] IN ('+
  @column_list+') ) P'

EXEC (@sql_str)
21 дек 17, 12:23    [21051322]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
sirus_christus
Member

Откуда:
Сообщений: 13
Minamoto, понял! Спасибо!
21 дек 17, 12:29    [21051359]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
sirus_christus
Member

Откуда:
Сообщений: 13
ptr128, Спасибо огромное
21 дек 17, 12:30    [21051364]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
QUOTENAME? не, не слышали...
21 дек 17, 12:39    [21051406]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
Добрый Э - Эх
Guest
Руслан Дамирович
QUOTENAME? не, не слышали...
есть мнение, что некоторые стараются сильно экономят на символах, сокращая длину своего кода.... в параллельной ветке форума люди даже письками мерились, у кого код будет короче...
21 дек 17, 13:26    [21051636]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Руслан Дамирович
QUOTENAME? не, не слышали...

Мне быстрее было выдрать подобный кусок из давно имеющеегося кода, чем еще и переделывать его. Разве это хоть как-то влияет на производительность запроса?
21 дек 17, 13:55    [21051761]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Добрый Э - Эх
Руслан Дамирович
QUOTENAME? не, не слышали...
есть мнение, что некоторые стараются сильно экономят на символах, сокращая длину своего кода.... в параллельной ветке форума люди даже письками мерились, у кого код будет короче...

Ну, для таких любителей есть brainf$ck.
Я фанатик понятности кода - потому что через 2-3-6-12 месяцев даже программист с памятью как у слона забудет, что там делает/считает код.

QUOTENAME здесь нужен не для красоты, а по конкретной причине - чтобы служебные символы в значениях не сломали работающий скрипт. Использовать динамический код - моветон; думать, что никто не добавит служебных символов - самонадеянно; а уж учить новичков НЕ использовать то, что нужно - за это вообще не эшафот нужно отправлять.
22 дек 17, 10:27    [21054470]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по одному полю  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Руслан Дамирович
QUOTENAME здесь нужен не для красоты, а по конкретной причине - чтобы служебные символы в значениях не сломали работающий скрипт.
Это касается только квадратных скобок.
Глупо просто добавлять их справа и слева к имени.
22 дек 17, 10:33    [21054491]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить