Краткое объяснение основного элемента, который может быть легко понят новичком в SQL Server - PullRequest
1 голос
/ 18 мая 2019

Требуется преобразовать столбцы таблицы в ряды способами.Потратив некоторое время, которое я нашел, это можно сделать с помощью предложения pivot.Но я не понимал концепцию, работу pivot операторов даже после просмотра многих статей, документов, которые, как они говорят, просты, но сложны для понимания.Так может ли кто-нибудь помочь мне понять основы сводки, используя таблицы?рассмотрим приведенные ниже таблицы, чтобы ответить

--------------
|name  |value|
|------|-----|
|rate1 |145  |
|rate2 |150  |
|rate3 |155  |
-------------- 

. Теперь я хочу получить результат как

-------------------
|rate1|rate2|rate3|
|-----|-----|-----|
|145  |150  |155  |
-------------------

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

-------
|value|
|145  |
|150  |
|155  |
-------

теперь результат должен выглядеть следующим образом:

----------------
|hdr1|hdr2|hdr3|
|----|----|----|
|145 |150 |155 |
----------------

Примечание: заголовки не имеют значения, это может быть что угодно для результирующей таблицы,теперь кто-нибудь, пожалуйста, помогите мне, как добиться этого. Объяснения будут высоко оценены.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Ваш запрос:

Просто прочитайте сообщение @ Arulkumar: https://stackoverflow.com/a/56197463/1666800

Объяснение PIVOT:

Покавы используете PIVOT, вам нужно ответить на три вопроса:

  1. Что вы хотите видеть в строках?(Давайте назовем это элементом группировки)
  2. Что вы хотите увидеть в столбцах?(Давайте назовем это Распределяющим элементом)
  3. Что вы хотите увидеть в точке пересечения строки и столбца?(Давайте назовем его Агрегирующий элемент)

После того, как вы ответите на эти вопросы, вы можете просто написать свой запрос PIVOT, как показано ниже:

WITH PivotData AS
(SELECT 
     <grouping column>, 
     <spreading column>, 
     <aggregation column>
 FROM < source table >
)
SELECT < select list > FROM PivotData
PIVOT( < aggregate function >(< aggregation column >)
FOR < spreading column > IN (< distinct spreading values >) ) AS P

PIVOT само возвращаетSET, что означает, что если вы используете его в своем запросе, вам необходимо присвоить ему псевдоним (здесь P).

Пример:

Представьте себеу нас есть таблица с тремя столбцами: CustomerId, ShipperId and Freight. нам нужно увидеть общий груз, отправленный каждым грузоотправителем для каждого клиента.давайте представим, что ShipperId имеет три различных значения: 1, 2 and 3.

WITH    PivotData AS 
( SELECT   
            CustomerId, -- grouping column
            ShipperId , -- spreading column
            Freight-- aggregation column
        FROM     Sales.Orders
)
SELECT  CustomerId,[1], [2], [3]
    FROM    PivotData 
PIVOT( 
    SUM(Freight) 
    FOR ShipperId IN ( [1], [2], [3] )
) AS P;

, результат будет таким:

CustomerId   [1]     [2]      [3]
----------------------------------
C1            5       7        2
C2            10      1        9
C3            6       0        4

Ограничения:

  1. Мы не можем использовать элемент Spreading и Aggregation в списке выбора для отображения в выводе
  2. Мы не можем использовать Count(*) в качестве функции агрегирования.Нам нужно указать имя столбца внутри функции Count
  3. Каждый PIVOT может иметь только одну функцию агрегирования
  4. Содержимое внутри IN должно быть статическим, и мы не можем указатьЗапрос Select внутри него, однако мы можем использовать Dynamic SQL для решения этой проблемы. (https://stackoverflow.com/a/10404455/1666800)
1 голос
/ 18 мая 2019

Следующая демка вернет ожидаемый результат с данными примера:

DECLARE @TestTable TABLE ([name] VARCHAR (20), [value] INT);

INSERT INTO @TestTable ([name], [value]) VALUES
('rate1', 145),
('rate2', 150),
('rate3', 155);

SELECT rate1, rate2, rate3 FROM 
( SELECT [name], [value] FROM @TestTable ) AS T1
PIVOT  
( SUM([value]) FOR [name] IN (rate1, rate2, rate3)) AS T2  

Выход:

rate1   rate2   rate3
-------------------------
145     150     155

В блоке PIVOT вам нужно указать, на какое значение вам нужно повернуть такие значения, как rate1, ...

Демонстрация по дб <> fiddle

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