Как предотвратить пустые поля в строках SQL Pivot? - PullRequest
0 голосов
/ 08 ноября 2018

Я запускаю SQL Pivot против varchar.

У меня есть следующая таблица:

`Continent    | State      | City
--------------------------------------------- 
North America | California | Oakland
North America | California | Los Angeles
North America | California | Sacramento
North America | California | San Diego
North America | California | San Francisco
North America | California | Upton
North America | Florida    | Jacksonville
North America | Florida    | Fort Lauderdale
North America | Florida    | Miami
North America | Florida    | Tampa
North America | New York   | Albany
North America | New York   | Buffalo
North America | New York   | New York
North America | New York   | Rochester
North America | New York   | Utica
North America | Texas      | Austin
North America | Texas      | Dallas
North America | Texas      | San Antonio`

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

`Continent     | California    | Florida         | New York    | Texas
-----------------------------------------------------------------------
North America | Oakland       | Jacksonville    | Albany      | Austin
North America | Los Angeles   | Fort Lauderdale | Buffalo     | Dallas
North America | Sacramento    | Miami           | New York    | San Antonio
North America | San Diego     | Tampa           | Rochester   | NULL
North America | San Francisco | NULL            | Utica       | NULL
North America | Upton         | NULL            | NULL        | NULL`

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


`        SELECT *
        FROM
        (
            SELECT Placename.Continent,
                Placename.State,
                Placename.City,
                row_number() over(partition by Placename.State order by Placename.City) rn
                FROM Placename
        ) AS SourceTable PIVOT(Min(City) FOR [State] IN([California],
        [Florida],
        [New York],
        [Texas]
        )) AS PivotTable`

Примечание: Мин (город) и Макс (город) дали мне одинаковый вывод

Теперь, после использования этого кода, приводится следующая таблица:

`Continent     | California    | Florida         | New York    | Texas
-----------------------------------------------------------------------
North America | Oakland       | Jacksonville    | NULL        | Austin
North America | NULL          | Fort Lauderdale | Albany      | Dallas
North America | Los Angeles   | NULL            | Buffalo     | NULL
North America | Sacramento    | Miami           | New York    | San Antonio
North America | NULL          | Tampa           | NULL        | NULL
North America | San Diego     | NULL            | Rochester   | NULL
North America | San Francisco | NULL            | Utica       | NULL
North America | Upton         | NULL            | NULL        | NULL`

В чем причина того, что выводимая таблица не совпадает с желаемым выводом таблицы?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Что-то вроде этого должно сделать это для вас.

--DROP TABLE #C
CREATE TABLE #C (X CHAR(1) , ID INT)
INSERT INTO #C values('A', 1)
INSERT INTO #C values(NULL, 2)
INSERT INTO #C values('B', 3)
INSERT INTO #C values('C', 4)
INSERT INTO #C values(NULL, 5)
INSERT INTO #C values('D', 6)

select *
from #C

enter image description here

SELECT ID,CASE WHEN X is not null
            THEN X
            ELSE (SELECT max(X)
                  FROM #C
                  WHERE ID <= t.ID)
       END AS X
FROM #C t 

enter image description here

Если это sql 2012, используйте это

SELECT ID,
COALESCE(Name,
LAG(Name,1) OVER (ORDER BY ID )) AS Name
FROM Table
If there can be multiple gaps use this instead
SELECT ID,
COALESCE(Name,
MAX(COALESCE(Name,'')) OVER (ORDER BY ID  ROWS BETWEEN UNBOUNDED PRECEDING AND  1 PRECEDING)) AS Name
FROM Table
0 голосов
/ 08 ноября 2018

просто попробуйте это:

DECLARE @tbl TABLE(Continent VARCHAR(100),[State] VARCHAR(100),City VARCHAR(100));
INSERT INTO @tbl VALUES
 ('North America','California','Oakland')
,('North America','California','Los Angeles')
,('North America','California','Sacramento')
,('North America','California','San Diego')
,('North America','California','San Francisco')
,('North America','California','Upton')
,('North America','Florida','Jacksonville')
,('North America','Florida','Fort Lauderdale')
,('North America','Florida','Miami')
,('North America','Florida','Tampa')
,('North America','New York','Albany')
,('North America','New York','Buffalo')
,('North America','New York','New York')
,('North America','New York','Rochester')
,('North America','New York','Utica')
,('North America','Texas','Austin')
,('North America','Texas','Dallas')
,('North America','Texas','San Antonio');

SELECT *
FROM
(
    SELECT Placename.Continent,
        Placename.State,
        Placename.City,
        row_number() over(partition by Placename.State order by Placename.City) rn
        FROM @tbl AS PlaceName
) AS SourceTable PIVOT(Min(City) FOR [State] IN([California],
[Florida],
[New York],
[Texas]
)) AS PivotTable;

Это точно ваш собственный запрос, работающий с таблицей макетов . Насколько я вижу, результат именно тот, который вам нужен:

+---------------+----+---------------+-----------------+-----------+-------------+
| Continent     | rn | California    | Florida         | New York  | Texas       |
+---------------+----+---------------+-----------------+-----------+-------------+
| North America | 1  | Los Angeles   | Fort Lauderdale | Albany    | Austin      |
+---------------+----+---------------+-----------------+-----------+-------------+
| North America | 2  | Oakland       | Jacksonville    | Buffalo   | Dallas      |
+---------------+----+---------------+-----------------+-----------+-------------+
| North America | 3  | Sacramento    | Miami           | New York  | San Antonio |
+---------------+----+---------------+-----------------+-----------+-------------+
| North America | 4  | San Diego     | Tampa           | Rochester | NULL        |
+---------------+----+---------------+-----------------+-----------+-------------+
| North America | 5  | San Francisco | NULL            | Utica     | NULL        |
+---------------+----+---------------+-----------------+-----------+-------------+
| North America | 6  | Upton         | NULL            | NULL      | NULL        |
+---------------+----+---------------+-----------------+-----------+-------------+

Если есть что-то еще позади, пожалуйста, используйте мой автономный образец сверху, настройте работающий пример, подобный моему, и опишите, что еще вам нужно.

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