(*^_^*)静一静 2025-07-29 11:31 采纳率: 18.8%
浏览 8

sql字符串的行转列问题怎么整?

表 dw.service_provider_indicator 里有 company (公司名称),indicator_type (指标类型),data( 指标数据data)
select company,indicator_type,data from dw.service_provider_indicator 展示如下

company indicator_type data
上海领升实业有限公司 工商照面 {"法人": "夏建国", "企业大类": "0", "企业类型": "有限责任公司(自然人独资)", "实缴资本": "5000 万人民币", "成立时间": "2012-03-23", "是否历史": 0, }
上海领升实业有限公司 抽查检查 [{"日期": "2024-07-15", "检查单位": "上海市青浦区市场监督管理局", "检查类型": "检查", "检查结果": "食品经营/日常检查:良好", "结果类型": "-1"}]
上海领升实业有限公司 纳税A级 [{"信用年份": "2024", "信用等级": "A"}, {"信用年份": "2021", "信用等级": "A"}]
上海领升实业有限公司 实际受益人 [{"任职": "股东", "受益人": "夏建国", "企业名称": "上海领升实业有限公司"}]
上海领升实业有限公司 实际控制人 [{"持股人名称": "夏建国", "持股人类型": "个人"}, {"持股人名称": "上海领升实业有限公司", "持股人类型": "企业"}]
上海领升实业有限公司 工商股东 [{"总实缴": "3500万人民币", "是否历史": 0, "股东姓名": "夏建国", "股东类型": "自然人股东", "持股出资比例": "1.0"}]
上海领升实业有限公司 行政处罚 [{"来源": "工商", "状态": "-", "公示日期": "2018-08-17", "处罚事由": "-",]

但是我想要的效果其实是行转列

公司名称 工商照面 抽查检查 纳税A级 实际受益人 实际控制人 工商股东 行政处罚
上海领升实业有限公司


请问下这个sql要怎么写呢

  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-07-29 11:49
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .  
    每日一句正能量,让它带给您好心情:迈出的每一步,都在靠近更好的自己。
    .  

    SQL字符串行转列解决方案

    要实现将指标类型(indicator_type)从行转为列的效果,可以使用SQL的CASE WHEN或PIVOT功能(取决于您使用的数据库系统)。以下是几种常见数据库的解决方案:

    方案1:使用CASE WHEN(通用SQL)

    SELECT 
      company AS "公司名称",
      MAX(CASE WHEN indicator_type = '工商照面' THEN data ELSE NULL END) AS "工商照面",
      MAX(CASE WHEN indicator_type = '抽查检查' THEN data ELSE NULL END) AS "抽查检查",
      MAX(CASE WHEN indicator_type = '纳税A级' THEN data ELSE NULL END) AS "纳税A级",
      MAX(CASE WHEN indicator_type = '实际受益人' THEN data ELSE NULL END) AS "实际受益人",
      MAX(CASE WHEN indicator_type = '实际控制人' THEN data ELSE NULL END) AS "实际控制人",
      MAX(CASE WHEN indicator_type = '工商股东' THEN data ELSE NULL END) AS "工商股东",
      MAX(CASE WHEN indicator_type = '行政处罚' THEN data ELSE NULL END) AS "行政处罚"
    FROM dw.service_provider_indicator
    GROUP BY company
    

    方案2:使用PIVOT(SQL Server/Oracle)

    SELECT company AS "公司名称", 
           [工商照面], [抽查检查], [纳税A级], [实际受益人], [实际控制人], [工商股东], [行政处罚]
    FROM 
    (
      SELECT company, indicator_type, data
      FROM dw.service_provider_indicator
    ) AS SourceTable
    PIVOT
    (
      MAX(data)
      FOR indicator_type IN ([工商照面], [抽查检查], [纳税A级], [实际受益人], [实际控制人], [工商股东], [行政处罚])
    ) AS PivotTable
    

    方案3:使用crosstab(PostgreSQL)

    SELECT * FROM crosstab(
      'SELECT company, indicator_type, data 
       FROM dw.service_provider_indicator 
       ORDER BY 1,2',
      'SELECT DISTINCT indicator_type 
       FROM dw.service_provider_indicator 
       ORDER BY 1'
    ) AS ct (
      company text,
      工商照面 jsonb,
      抽查检查 jsonb,
      纳税A级 jsonb,
      实际受益人 jsonb,
      实际控制人 jsonb,
      工商股东 jsonb,
      行政处罚 jsonb
    )
    

    注意事项

    1. 根据您的数据库类型选择适合的方案
    2. 如果data字段是JSON格式,可能需要根据数据库类型进行特殊处理
    3. 如果指标类型不固定,可能需要使用动态SQL
    4. 结果中的JSON数据可能需要进一步解析才能显示为更易读的格式

    您可以根据实际使用的数据库系统选择最适合的方案。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月29日