【问题标题】:How do I prevent NULL fields in rows SQL Pivot?如何防止 SQL Pivot 行中的 NULL 字段?
【发布时间】:2019-04-11 14:01:38
【问题描述】:

我正在针对 varchar 运行 SQL Pivot。

我有下表:

`大陆 |状态 |城市 --------------------------------------------- 北美 |加利福尼亚 |奥克兰 北美 |加利福尼亚 |洛杉矶 北美 |加利福尼亚 |萨克拉门托 北美 |加利福尼亚 |圣地亚哥 北美 |加利福尼亚 |旧金山 北美 |加利福尼亚 |厄普顿 北美 |佛罗里达 |杰克逊维尔 北美 |佛罗里达 |劳德代尔堡 北美 |佛罗里达 |迈阿密 北美 |佛罗里达 |坦帕 北美 |纽约 |奥尔巴尼 北美 |纽约 |水牛 北美 |纽约 |纽约 北美 |纽约 |罗切斯特 北美 |纽约 |尤蒂卡 北美 |德州 |奥斯汀 北美 |德州 |达拉斯 北美 |德州 |圣安东尼奥`

我想创建一个如下所示的数据透视表:

`大陆 |加利福尼亚 |佛罗里达 |纽约 |德克萨斯州 -------------------------------------------------- --------------------- 北美 |奥克兰 |杰克逊维尔 |奥尔巴尼 |奥斯汀 北美 |洛杉矶 |劳德代尔堡 |布法罗 |达拉斯 北美 |萨克拉门托 |迈阿密 |纽约 |圣安东尼奥 北美 |圣地亚哥 |坦帕 |罗切斯特 |空值 北美 |旧金山 |空 |尤蒂卡 |空值 北美 |厄普顿 |空 |空 |空`

我目前正在使用以下代码:

` 选择 * 从 ( 选择地名.大陆, 地名.州, 地名.城市, row_number() over(按 Placename.State 分区按 Placename.City 排序) rn FROM 地名 ) AS SourceTable PIVOT(Min(City) FOR [State] IN([California], [佛罗里达], [纽约], [德克萨斯] )) 作为数据透视表`

注意:Min(City) 和 Max(City) 给了我相同的输出

现在,使用这段代码后,给出下表:

`大陆 |加利福尼亚 |佛罗里达 |纽约 |德克萨斯州 -------------------------------------------------- --------------------- 北美 |奥克兰 |杰克逊维尔 |空 |奥斯汀 北美 |空 |劳德代尔堡 |奥尔巴尼 |达拉斯 北美 |洛杉矶 |空 |布法罗 |空值 北美 |萨克拉门托 |迈阿密 |纽约 |圣安东尼奥 北美 |空 |坦帕 |空 |空值 北美 |圣地亚哥 |空 |罗切斯特 |空值 北美 |旧金山 |空 |尤蒂卡 |空值 北美 |厄普顿 |空 |空 |空`

正在输出的表与期望的表输出不一样的原因是什么?

【问题讨论】:

  • 删除 row_number 现在只选择每个州的第一个城市,而不是每个州的所有城市
  • 您想要每个州的全部或第一个城市?
  • 每个州的所有
  • 如果您显示查询的完整结果,尤其是 rn 列,可能会更有帮助。您的查询似乎是正确的,但我们可能会通过查看结果了解更多信息。当然,如果您提供使用数据集填充表所需的脚本,那将更有帮助。请看这篇文章开始:stackoverflow.com/help/how-to-ask
  • 我刚刚使用您的确切数据运行了您的确切查询,它给了我您想要的输出 - 而不是您假设的实际输出。所以肯定有比张贴更多的内容。

标签: sql sql-server tsql database-design pivot


【解决方案1】:

这样的事情应该为你做。

--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

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 

如果它的 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

【讨论】:

    【解决方案2】:

    试试这个:

    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;
    

    完全是您自己的查询与 mockup-table 一起工作。据我所知,结果正是您需要的:

    +---------------+----+---------------+-----------------+-----------+-------------+
    | 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        |
    +---------------+----+---------------+-----------------+-----------+-------------+
    

    如果还有更多内容,请使用我上面的独立示例,设置一个像我一样的运行示例并描述您还需要什么。

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 2023-03-18
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多