【问题标题】:Display empty value when there is no data on the table in SQL ServerSQL Server 表中无数据时显示空值
【发布时间】:2021-12-27 13:09:27
【问题描述】:

我有表格和查询来从行到列选择数据,如下所示:

 id  |  type    | data
-----------------------
  1  |  Name    | John
  1  |  Gender  | Male
  1  |  Code    | 1782
  2  |  Name    | Dave
  2  |  Gender  | Male

查询:

select a.id, a.data as [Name], b.data as [Gender], c.data as [Code]
from table1 a join table1 b on a.id = b.id
              join table1 c on b.id = c.id
where a.type = 'Name' and b.type = 'Gender' and c.type = 'Code'

结果:

  id |  Name   | Gender | Code  
 ------------------------------
  1  |  John   |  Male  | 1782

在这种情况下,名为“Dave”的 id 编号 2 没有“代码”,因此它不会出现在结果中。我怎样才能在“代码”表上显示带有空数据或 NULL 的结果,所以它会有这样的结果:

  id |  Name   | Gender | Code  
 ------------------------------
  1  |  John   |  Male  | 1782 
  2  |  Dave   |  Male  |

【问题讨论】:

    标签: sql sql-server sql-server-2008 database-table


    【解决方案1】:

    您可以使用CASE 表达式代替JOINs:

    SELECT
      a.id,
      MAX(CASE WHEN a.type = 'Name' THEN a.data ELSE '' END) AS [Name],
      MAX(CASE WHEN a.type = 'Gender' THEN a.data ELSE '' END) AS [Gender],
      MAX(CASE WHEN a.type = 'Code' THEN a.data ELSE '' END) AS [Code]
    FROM table1 a
    WHERE
        a.type IN('Name', 'Gender', 'Code')
    GROUP BY a.id
    

    【讨论】:

    • 谢谢它是正确的,只是在 MAX(CASE WHEN a.type = ...) 行中的更正而不是 a.data。
    • @Reusellmy,好眼睛 ;).. 我已更正,很高兴它有所帮助。
    【解决方案2】:
    select a.id, a.data as [Name], b.data as [Gender], c.data as [Code]
    from table1 a
    left join table1 b on a.id = b.id and b.type='Gender'
    left join table1 c on b.id = c.id and c.type='Code'
    where a.type = 'Name' 
    

    【讨论】:

    • 根据问题是正确的,但是当空值或中间为null时,其余数据也变为null。
    【解决方案3】:

    使用pivot 查询

    select *
    from   table1
           pivot
           (
               max(data)
               for type in ([Name], [Gender], [Code])
           ) p
    

    demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多