sql语句编写-如何让一列值固定有几行(扩展)

img


数据集如上,想要结果为:每个RQ对应的WERKS 列都有:2021 2022 2023
想自动扩展(新增)行 对应JE 新增出来的赋值0
比如:
2023-05-08 2021 0
2023-05-08 2022 106.57
2023-05-08 2023 0

注:数据库为HANA

SELECT t1.RQ, t2.WERKS, COALESCE(t3.JE, 0) AS JE
FROM (
    SELECT DISTINCT RQ
    FROM your_table
) t1
CROSS JOIN (
    SELECT DISTINCT WERKS
    FROM your_table
    WHERE WERKS IN (2021, 2022, 2023) -- 要固定的年份值
) t2
LEFT JOIN your_table t3
    ON t1.RQ = t3.RQ AND t2.WERKS = t3.WERKS
ORDER BY t1.RQ, t2.WERKS


或者用临时表存WERKS的值


-- 假设原表名为 your_table

-- 创建临时表 temp_table
CREATE TEMPORARY TABLE temp_table AS (
SELECT DISTINCT RQ FROM your_table
);

-- 用 CROSS JOIN 操作和 COALESCE 函数
SELECT t.RQ, w.WERKS, COALESCE(y.JE, 0) AS JE
FROM temp_table t
CROSS JOIN (SELECT 2021 AS WERKS UNION ALL SELECT 2022 UNION ALL SELECT 2023) w
LEFT JOIN your_table y ON y.RQ = t.RQ AND y.WERKS = w.WERKS
ORDER BY t.RQ, w.WERKS;

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
您可以使用CROSS JOINUNION ALL来实现这个需求。具体来说,您可以先使用CROSS JOIN将RQ和WERKS两列进行组合,以生成所有可能的组合,然后使用UNION ALL将原始数据集和生成的组合合并在一起。
【示例】
以下是一个示例SQL语句:

SELECT t1.RQ, t2.WERKS, COALESCE(t3.JE, 0) AS JE
FROM (
    SELECT DISTINCT RQ FROM your_table
) t1
CROSS JOIN (
    SELECT DISTINCT WERKS FROM your_table
) t2
LEFT JOIN your_table t3 ON t3.RQ = t1.RQ AND t3.WERKS = t2.WERKS
UNION ALL
SELECT RQ, WERKS, 0 AS JE
FROM your_table

在上面的SQL语句中,t1t2分别表示RQ和WERKS的所有可能的取值组合。然后使用LEFT JOIN将原始数据集your_table与组合进行连接,并使用COALESCE函数将缺失的值填充为0。最后使用UNION ALL将原始数据集和生成的组合合并在一起,并将缺失的值填充为0。

请注意,上述SQL语句只是一个示例,您需要将其中的表名、列名和条件替换为您实际使用的名称。此外,由于您使用的是HANA数据库,可能需要根据具体情况进行微调。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

思路:
可以通过在SQL语句中使用UNION ALL将每个RQ对应的WERKS列都复制出来,然后在每个复制出来的列中添加对应的年份,如果该年份不存在,则将其赋值为0。

具体代码如下:

SELECT RQ, WERKS, 
CASE 
    WHEN YEAR = 2021 THEN JE
    ELSE 0
END AS '2021',
CASE 
    WHEN YEAR = 2022 THEN JE
    ELSE 0
END AS '2022',
CASE 
    WHEN YEAR = 2023 THEN JE
    ELSE 0
END AS '2023'
FROM (
    SELECT RQ, WERKS, YEAR(TO_DATE(RQ, 'YYYY-MM-DD')) AS YEAR, JE
    FROM your_table
) t
UNION ALL
SELECT RQ, WERKS,
CASE 
    WHEN YEAR = 2021 THEN 0
    ELSE 0
END AS '2021',
CASE 
    WHEN YEAR = 2022 THEN 0
    ELSE 0
END AS '2022',
CASE 
    WHEN YEAR = 2023 THEN 0
    ELSE 0
END AS '2023'
FROM (
    SELECT DISTINCT RQ, WERKS, YEAR
    FROM (
        SELECT RQ, WERKS, 2021 AS YEAR FROM your_table
        UNION SELECT RQ, WERKS, 2022 AS YEAR FROM your_table
        UNION SELECT RQ, WERKS, 2023 AS YEAR FROM your_table
    ) t
) t2
ORDER BY RQ, WERKS

其中,第一个SELECT语句用于复制出原始数据,并根据年份将JE值赋值到对应的列中;第二个SELECT语句用于新增数据,年份对应的列全部赋值为0。最后通过UNION ALL将两个SELECT语句的结果合并在一起,并按照RQ和WERKS排序。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
针对这个问题,可以使用联结查询和子查询来解决。以下是一些 SQL 代码示例,可以根据实际情况进行修改。

  1. 创建一个包含完整日期范围和所有工厂的基本数据集
WITH dates AS (
  SELECT DISTINCT RQ FROM your_table
), factories AS (
  SELECT DISTINCT WERKS FROM your_table
)
SELECT dates.RQ, factories.WERKS 
FROM dates, factories ORDER BY RQ, WERKS

这将返回一个带有日期和工厂名称的结果集,其中每个日期都与所有工厂匹配。

  1. 将基本数据集与实际数据的聚合进行联结
WITH dates AS (
  SELECT DISTINCT RQ FROM your_table
), factories AS (
  SELECT DISTINCT WERKS FROM your_table
), base_data AS (
  SELECT dates.RQ, factories.WERKS 
  FROM dates, factories ORDER BY RQ, WERKS
), actual_data AS (
  SELECT RQ, WERKS, SUM(JE) AS JE_SUM 
  FROM your_table 
  GROUP BY RQ, WERKS
)
SELECT base_data.RQ, base_data.WERKS, COALESCE(actual_data.JE_SUM, 0) AS JE_SUM 
FROM base_data LEFT JOIN actual_data 
ON base_data.RQ = actual_data.RQ AND base_data.WERKS = actual_data.WERKS 
ORDER BY RQ, WERKS

这将联结两个子查询,一个包含完整的日期和工厂名称,另一个包含实际的JE汇总。LEFT JOIN 关键字将确保即使没有匹配的行,也会返回基本数据集中的每一行。

  1. 将结果导出成 HANA 上的表
CREATE TABLE your_result_table (
  RQ DATE, 
  WERKS NVARCHAR(10), 
  JE_SUM DECIMAL(18, 2)
);

INSERT INTO your_result_table 
WITH dates AS (
  SELECT DISTINCT RQ FROM your_table
), factories AS (
  SELECT DISTINCT WERKS FROM your_table
), base_data AS (
  SELECT dates.RQ, factories.WERKS 
  FROM dates, factories ORDER BY RQ, WERKS
), actual_data AS (
  SELECT RQ, WERKS, SUM(JE) AS JE_SUM 
  FROM your_table 
  GROUP BY RQ, WERKS
)
SELECT base_data.RQ, base_data.WERKS, COALESCE(actual_data.JE_SUM, 0) AS JE_SUM 
FROM base_data LEFT JOIN actual_data 
ON base_data.RQ = actual_data.RQ AND base_data.WERKS = actual_data.WERKS 
ORDER BY RQ, WERKS;

这将创建一个名为 your_result_table 的表,其中包含从基本数据集和实际 JE 汇总生成的数据。最后的 INSERT INTO 示例将结果直接插入该表中。
如果我的回答解决了您的问题,请采纳!