Преобразовать строки в столбец по дате с помощью сводной - PullRequest
0 голосов
/ 03 октября 2019

Я прочитал материал в сводных таблицах MS, и у меня все еще возникают проблемы с получением этого правильного значения.

Данные

wh_id |  saledate |   qty      |
105   |  20190901 | 134.000000 |
105   |  20190902 | 190.000000 |
105   |  20190903 | 148.500000 |
105   |  20190904 | 157.500000 |
105   |  20190905 | 209.500000 |

Я бы хотел, чтобы он выступил в качестве сводной таблицы,вот так:

wh_id | 1   |  2   |  3   |   4   |  5    |
105   | 134 | 190  |148.5 | 157.5 | 209.5 |

вот этот код:

DECLARE
@cols   nvarchar(max)='' ,

@query  nvarchar(max)=''

SET @cols = STUFF((SELECT ',' + QUOTENAME(DATEPART(dd, saledate)) 
                   FROM sales
                   WHERE month(saleDATE)=9 and year(saleDATE)=2019 and wh_id=105
                   GROUP BY saledate
                   ORDER BY saledate ASC
                   FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');

set @query = 'SELECT [wh_id], ' + @cols + ' 
            from 
            (
              select [wh_id], QUOTENAME(DATEPART(dd, saledate)) saledate,qty
              from sales where month(saleDATE)=9 and year(saleDATE)=2019 and wh_id=105    
            ) x
            pivot 
            (
                sum(qty)
                for [saledate] in (' + @cols + ')
            ) p '       

execute(@query);

но результат такой

wh_id | 1 | 2 | 3 | 4 | 5 | 
105   | 1 | 2 | 3 | 4 | 5 |

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

просто измените исходную часть из вышеприведенного запроса, удалите QUOTENAME, примененную к saledate, и попробуйте выполнить запрос, вы найдете ожидаемый результат.

set @query = 'SELECT [wh_id], ' + @cols + ' from ( select [wh_id], DATEPART(dd, saledate) saledate,qty from sales where month(saleDATE)=9 and year(saleDATE)=2019 and wh_id=105<br> ) x pivot ( sum(qty) for [saledate] in (' + @cols + ')) p '

0 голосов
/ 03 октября 2019
select wh_id,
  max(case when rn = 1 then qty end) '1',
  max(case when rn = 2 then qty end) '2',
  max(case when rn = 3 then qty end) '3',
  max(case when rn = 4 then qty end) '4',
  max(case when rn = 5 then qty end) '5'

from
(
  select wh_id,qty,
    row_number() over(partition by wh_id order by qty) rn
  from YourTableName
) src
group by wh_id

Выход: -

enter image description here

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

В приведенном выше примере .... я забыл добавить десятичное значение в таблице .. ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...