【问题标题】:How to create separate columns for values in Database如何为数据库中的值创建单独的列
【发布时间】:2015-07-07 11:21:25
【问题描述】:

我有一个 SQL 查询,它显示来自数据库中不同表的信息。其中一个字段称为 PieceType,其中包含 PLT、CASE、CTN 等值。每个公司可能有不同数量的 PieceType,例如公司 4 可能只有 PLT,但公司 5 可能有 10 种不同的类型。我想在单独的列中显示这些类型,例如:

Plt | CASE | CTN

我的 SQL 查询:

SELECT  c.Name,
        jp.PieceType
FROM customer c
LEFT JOIN job_new jn ON ja.JobID = jn.ID
LEFT JOIN job_pieces jp ON ja.JobID = jp.ID
WHERE c.Company_ID = compid
GROUP BY c.ID

现在查询只显示 PieceTypes 中的一个值,即使该公司可能有多种工件类型。我尝试了GROUP_CONCAT(DISTINCT jp.PieceType),但它显示了同一列中的所有值。我需要每个部分都在一个单独的列中。 示例数据库可以在 sqlfiddle 上找到:http://www.sqlfiddle.com/#!9/c34306/3

【问题讨论】:

  • 我真的不明白为什么你想要不同的列,你可以用 case 语句来代替你所拥有的每种类型,假设你有有限的 set 。选择 c.name,当 jp.PieceType='Plt' 然后 'Plt' 以 Plt 结尾时的情况,当 jp.PieceType='CASE' 然后 'CASE' 以 'CASE' 结尾时...
  • @BhargavSarvepalli 如果它们是分开的,它将有助于显示我需要的报告,因为使用一列不能正确显示它们。我不能为每件作品创建一个案例,就像我说一家公司只能有一个,而另一家可以有 30 个
  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 有没有办法只拆分值?就像我说的,如果我使用GROUP_CONCAT(DISTINCT jp.PieceType),值将显示为 CTN、FP、CASE。是否可以将每个值拆分为单独的列?

标签: mysql sql mysql-workbench multiple-columns


【解决方案1】:

您可以做的是选择在哪里查找所需的属性。

即:

Select 
name,
(select property from job_pieces where companyid = id and property = 'A') as A,
(select property from job_pieces where companyid = id and property = 'B') as B,
(select property from job_pieces where companyid = id and property = 'C') as C
 from company

【讨论】:

  • 但是属性需要是每种类型的吗?一家公司可能有 30 种类型,所以我无法选择每种类型
  • 如果你总共有 30 种不同的类型,你必须做 30 次循环。
  • 您可以通过搜索和替换来相当快地做到这一点,并用一些复制+过去的魔法
  • 您真的需要在这一层的不同列中使用它们吗?更标准的方法是在表示层获取所有属性和循环。
  • 是的,将它们放在单独的列中会更容易,因为显示报告的代码已经完成。我只是希望编辑这个查询
【解决方案2】:

我认为您正在寻找数据透视表。希望这可行:

SET group_concat_max_len=4294967294;
SET @COLUMNS = NULL;

/* Build columns to pivot */

SELECT GROUP_CONCAT(
        DISTINCT CONCAT(
            'CASE WHEN jp.PieceType = "', 
            jp.PieceType ,
            '" THEN 1 ELSE NULL END AS ',
            jp.PieceType
        )
) INTO @COLUMNS
FROM job_pieces jp;

/* Build full query */
SET @SQL = CONCAT(
        'SELECT  
                c.Name,
                ',@COLUMNS,'
        FROM customer c
        LEFT JOIN job_new jn ON ja.JobID = jn.ID
        LEFT JOIN job_pieces jp ON ja.JobID = jp.ID
        WHERE c.Company_ID = compid
        GROUP BY c.ID'
);

/* Prepare and execute the query*/
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

  • 我收到 PREPARE 语句的 SQL 错误。真的需要吗?
  • 抱歉在查询中忘记了INTO @COLUMNS。希望这现在有效。 “这真的需要吗?”是什么意思?
  • 我收到错误:结果包含多于一行
  • DISTINCT CONTAT 之前忘记了 GROUP_CONCAT 。希望这是一次很好的尝试 :) 对于那些错误,如果不实时运行查询,很难看到缺失的元素。
  • 好的,谢谢你摆脱了错误,但它显示的结果是'PRL','9',NULL,NULL,'0','0','2684.18','1', 'CTN,FP', 'GROUP_CONCAT(IF(jp.PieceType = \"CTN\", 1, NULL)) AS CTN,GROUP_CONCAT(IF(jp.PieceType = \"FP\", 1, NULL)) AS FP '
猜你喜欢
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2019-09-15
相关资源
最近更新 更多