SQL问题

SELECT 

    CASE 

         WHEN Month_Column  = 1 THEN Jan_value

        WHEN Month_Column  = 2 THEN feb_value

        WHEN Month_Column  = 3 THEN mar_value

        WHEN Month_Column  = 4 THEN mar_value

        WHEN Month_Column  = 5 THEN may_value

        WHEN Month_Column  = 6 THEN jun_value

        WHEN Month_Column  = 7 THEN api_value

        WHEN Month_Column  = 8 THEN aug_value

        WHEN Month_Column  = 9 THEN sep_value

        WHEN Month_Column  = 10 THEN oct_value

        WHEN Month_Column  = 11 THEN nov_value

        WHEN Month_Column = 12 THEN dev_value

        -- 继续添加其他月份的对应关系

    END AS Corresponding_Value

FROM factorypresetsproduction where YEAR = "2024" and Month_Column BETWEEN 1 AND 8;

提示我找不到Month_Column 字段,我想查询1月到8月之间的数据,求大佬解惑~

FineReport 帆软用户arYLnKyHW7 发布于 2024-8-7 10:03
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
1
华莉星宸Lv7高级互助
发布于2024-8-7 10:05

看看这个表里面factorypresetsproduction  有没有Month_Column字段

  • 帆软用户arYLnKyHW7 帆软用户arYLnKyHW7(提问者) Jan_value、feb_value、mar_value、mar_value、may_value、jun_value、api_value、aug_value、sep_value、oct_value、nov_value、dev_value以上字段对应1到12月,Month_Column字段相当于是参数
    2024-08-07 10:11 
  • 华莉星宸 华莉星宸 回复 帆软用户arYLnKyHW7(提问者) 那就不是这样直接用,参考一下的写法 select 1 as Month_Column,Jan_value from factorypresetsproduction union all select 2 as Month_Column,feb_value from factorypresetsproduction
    2024-08-07 10:15 
  • 华莉星宸 华莉星宸 回复 帆软用户arYLnKyHW7(提问者) 你想做的是列转行吧
    2024-08-07 10:18 
  • 帆软用户arYLnKyHW7 帆软用户arYLnKyHW7(提问者) 回复 华莉星宸 我先试下您这个sql写法
    2024-08-07 10:20 
最佳回答
0
snrtuemcLv8专家互助
发布于2024-8-7 10:06

正常可以的

真不行Month_Column 换成Corresponding_Value试试,照理不会啊

最佳回答
0
超级无敌小熊蛋Lv4初级互助
发布于2024-8-7 10:10(编辑于 2024-8-7 10:12)

老师,您的这段SQL四月应该是 April。

SELECT 

    CASE 

         WHEN Month_Column  = 1 THEN Jan_value

        WHEN Month_Column  = 2 THEN feb_value

        WHEN Month_Column  = 3 THEN mar_value

        WHEN Month_Column  = 4 THEN apr_value

        WHEN Month_Column  = 5 THEN may_value

        WHEN Month_Column  = 6 THEN jun_value

        WHEN Month_Column  = 7 THEN api_value

        WHEN Month_Column  = 8 THEN aug_value

        WHEN Month_Column  = 9 THEN sep_value

        WHEN Month_Column  = 10 THEN oct_value

        WHEN Month_Column  = 11 THEN nov_value

        WHEN Month_Column = 12 THEN dev_value

        -- 继续添加其他月份的对应关系

    END AS Corresponding_Value a

FROM factorypresetsproduction where a.YEAR = "2024" and a.Month_Column >= 1 AND a.Month_Column <= 8;

最佳回答
0
JL98Lv6中级互助
发布于2024-8-7 10:16(编辑于 2024-8-7 10:17)

在您提供的列名列表中,似乎有一个小错误,mar_value 出现了两次,而 dev_value 可能是 dec_value 的误写,表示十二月的值。对于 SQL 中的列转行操作,我们通常使用 PIVOT(在一些数据库如 Oracle, SQL Server 中支持)或 CASE 语句和聚合函数(如 SUM 或 MAX,取决于数据的特点)来手动实现(在所有数据库中都可用)。

这里,我将使用 CASE 语句和 MAX 函数(假设每个月份的值只对应一行,或者我们只关心每个月份的最新/最大值)来展示如何将列转换为行。以下是一个示例 SQL 查询,假设这些列都在一个名为 monthly_data 的表中:

----------------------------------------------------------------------------------------------------

sql

SELECT   

 id, -- 假设表中有一个唯一标识符列名为 id    

MAX(CASE WHEN month = 'Jan' THEN value ELSE NULL END) AS Jan_value,   

MAX(CASE WHEN month = 'Feb' THEN value ELSE NULL END) AS Feb_value,    

MAX(CASE WHEN month = 'Mar' THEN value ELSE NULL END) AS Mar_value,    

MAX(CASE WHEN month = 'Apr' THEN value ELSE NULL END) AS Apr_value, -- 假设缺少 Apr_value    

MAX(CASE WHEN month = 'May' THEN value ELSE NULL END) AS May_value,    

MAX(CASE WHEN month = 'Jun' THEN value ELSE NULL END) AS Jun_value,    

MAX(CASE WHEN month = 'Jul' THEN value ELSE NULL END) AS Jul_value, -- 假设缺少 Jul_value  MAX(CASE WHEN month = 'Aug' THEN value ELSE NULL END) AS Aug_value,    

MAX(CASE WHEN month = 'Sep' THEN value ELSE NULL END) AS Sep_value,    

MAX(CASE WHEN month = 'Oct' THEN value ELSE NULL END) AS Oct_value,    

MAX(CASE WHEN month = 'Nov' THEN value ELSE NULL END) AS Nov_value,   

 MAX(CASE WHEN month = 'Dec' THEN value ELSE NULL END) AS Dec_value -- 修正了 dev_value 为 Dec_value

FROM (   

 SELECT        id, -- 假设原始表中有 id 列       

 'Jan' AS month,        

Jan_value AS value    

FROM monthly_data    

UNION ALL   

 SELECT        

id,      

  'Feb',        

Feb_value    

FROM monthly_data    

UNION ALL    -- 为 Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 重复上述模式    -- 注意: 需要为每个月份添加一个 UNION ALL 子句    SELECT        id,        'Dec',        dec_value -- 使用正确的列名    FROM monthly_data) AS pivoted_dataGROUP BY id;

注意:上面的查询实际上是一个“行转列”的例子,因为您原始的问题中给出的列名看起来像是要从列转换为行,但通常当我们谈论列转行时,我们是指将表中的多行数据(每行表示不同的属性或类别)转换为列的形式。然而,由于您提供了列名,我假设您想要的是将多列(每个月份一个列)转换为一个更灵活的行格式,但这通常是通过聚合和 CASE 语句来实现的,如上面的查询所示。

如果您的意图是将多列数据转换成多行(每个月份一行),那么上面的查询(尽管是一个“行转列”的示例)可以通过简单地去掉外层的 GROUP BY 和 MAX 函数,并直接选择 id 和 month、value 来实现“列转行”的效果,但这样您就需要一个原始的包含月份和值的表结构,而不是一个列一个月份的静态表。

最佳回答
0
用户bBKn44909079Lv3见习互助
发布于2024-8-7 10:19

with A as (

select YEAR,1 as Month_Column,Jan_value as value from factorypresetsproduction

select YEAR,2 as Month_Column,feb_value as value from factorypresetsproduction

select YEAR,3 as Month_Column,mar_value as value from factorypresetsproduction

select YEAR,4 as Month_Column,mar_value as value from factorypresetsproduction

select YEAR,5 as Month_Column,may_value as value from factorypresetsproduction

select YEAR,6 as Month_Column,jun_value as value from factorypresetsproduction

select YEAR,7 as Month_Column,api_value as value from factorypresetsproduction

select YEAR,8 as Month_Column,aug_value as value from factorypresetsproduction

select YEAR,9 as Month_Column,sep_value as value from factorypresetsproduction

select YEAR,10 as Month_Column,oct_value as value from factorypresetsproduction

select YEAR,11 as Month_Column,nov_value as value from factorypresetsproduction

select YEAR,12 as Month_Column,dev_value as value from factorypresetsproduction)

select * from A where YEAR = "2024" and Month_Column BETWEEN 1 AND 8;

这样应该可以

  • 6关注人数
  • 194浏览人数
  • 最后回答于:2024-8-7 10:19
    请选择关闭问题的原因
    确定 取消
    返回顶部