【问题标题】:How to use the CONCAT() function in MySQL?如何在 MySQL 中使用 CONCAT() 函数?
【发布时间】:2017-08-07 20:33:15
【问题描述】:

我有两张表处于一对多关系中。在表 2 中,我希望将三列转换为行数据。为什么?这些将用于与另一个流程(作为数据源)合并以生成文档。请参阅the breakdown 的附件和相关输出。

这是第一个具有所需准确信息的成功查询。

SELECT 
tblClients.fldDRCClientID,
fldLastName,
e1.fldCreditorName,
e1.fldDebtAccountNumber,
e1.fldEnrolledDebt
From tblClients
Left Join tblDebtAccountNumber as e1 ON e1.tblClients_fldDRCClientID = tblClients.fldDRCClientID;

第一个查询结果:

【问题讨论】:

  • 您查看过 sql 连接表吗? - 你没有连接文本..是吗?你想要一个字段的连接显示
  • 欢迎来到 Stack Overflow。请不要将问题中最重要的部分隐藏在超链接图像中。相反,edit 您的问题,粘贴您的查询和示例的文本,并将它们缩进四个空格以表明它们是代码。对于它的价值,pivoting 是您的问题的总称,它是 MySQL 中臭名昭著的痛苦。
  • 其实是想从行数据转换成列数据;不是相反。这种情况最好在表示层而不是 SQL 中处理。如果您必须在数据库中执行此操作,那么您需要一个 mySQL 不支持的动态数据透视表,因此您必须使用动态案例语句并模拟 row_number()。 Bluefeet 有一个很好的例子:stackoverflow.com/questions/12004603/…
  • 建议的最终布局对于任何其他进程的数据源来说都是一个坏主意。保留一组规范化的行要好得多。考虑一个客户拥有更多帐户(可能有数百个)的可能性,这样一个记录的“宽度”对于编程来说真的很可怕。只需加入 2 个表并接受某些列会重复(例如客户端 ID);这还不错,它是可预测且易于编程的。
  • 我听到了。但是,一般客户只有少数(超过 8 个是不寻常的)。第二个考虑是记录具有必须保持在一起的三个组成部分; A-账号,B-余额,C-债权人姓名。因此,它必须能够以矩阵格式传送到文档中。 A、B、C 1 号线; D、E、F 2 号线等

标签: mysql group-concat


【解决方案1】:

(代表问题作者发布以将其从 cmets 移出)。

这是我的查询:

SELECT idt.fldDRCClientID
    , idt.fldLastName
    , COALESCE(grp.fldCreditorName1, '') as fldCreditorName1
    , COALESCE(grp.fldDebtAccountNumber1, '') as fldDebtAccountNumber1
    , COALESCE(grp.fldEnrolledDebt1, '') as fldEnrolledDebt1
    , COALESCE(grp.fldCreditorName2, '') as fldCreditorName2
    , COALESCE(grp.fldDebtAccountNumber2, '') as fldDebtAccountNumber2
    , COALESCE(grp.fldEnrolledDebt2, '') as fldEnrolledDebt2
    , COALESCE(grp.fldCreditorName3, '') as fldCreditorName3
    , COALESCE(grp.fldDebtAccountNumber3, '') as fldDebtAccountNumber3
    , COALESCE(grp.fldEnrolledDebt3, '') as fldEnrolledDebt3
    , COALESCE(grp.fldCreditorName4, '') as fldCreditorName4
    , COALESCE(grp.fldDebtAccountNumber4, '') as fldDebtAccountNumber4
    , COALESCE(grp.fldEnrolledDebt4, '') as fldEnrolledDebt4
    , COALESCE(grp.fldCreditorName5, '') as fldCreditorName5
    , COALESCE(grp.fldDebtAccountNumber5, '') as fldDebtAccountNumber5
    , COALESCE(grp.fldEnrolledDebt5, '') as fldEnrolledDebt5
    , COALESCE(grp.fldCreditorName6, '') as fldCreditorName6
    , COALESCE(grp.fldDebtAccountNumber6, '') as fldDebtAccountNumber6
    , COALESCE(grp.fldEnrolledDebt6, '') as fldEnrolledDebt6
FROM tblClients idt
LEFT JOIN (
    SELECT d.IndividualNumber as IndividualNumber
        , MAX(CASE WHEN row = 1 THEN d.fldCreditorName END) AS fldCreditorName1
        , MAX(CASE WHEN row = 1 THEN d.fldDebtAccountNumber END) AS fldDebtAccountNumber1
        , MAX(CASE WHEN row = 1 THEN d.fldEnrolledDebt END) AS fldEnrolledDebt1
        , MAX(CASE WHEN row = 2 THEN d.fldCreditorName END) AS fldCreditorName2
        , MAX(CASE WHEN row = 2 THEN d.fldDebtAccountNumber END) AS fldDebtAccountNumber2
        , MAX(CASE WHEN row = 2 THEN d.fldEnrolledDebt END) AS fldEnrolledDebt2
        , MAX(CASE WHEN row = 3 THEN d.fldCreditorName END) AS fldCreditorName3
        , MAX(CASE WHEN row = 3 THEN d.fldDebtAccountNumber END) AS fldDebtAccountNumber3
        , MAX(CASE WHEN row = 3 THEN d.fldEnrolledDebt END) AS fldEnrolledDebt3
        , MAX(CASE WHEN row = 4 THEN d.fldCreditorName END) AS fldCreditorName4
        , MAX(CASE WHEN row = 4 THEN d.fldDebtAccountNumber END) AS fldDebtAccountNumber4
        , MAX(CASE WHEN row = 4 THEN d.fldEnrolledDebt END) AS fldEnrolledDebt4
        , MAX(CASE WHEN row = 5 THEN d.fldCreditorName END) AS fldCreditorName5
        , MAX(CASE WHEN row = 5 THEN d.fldDebtAccountNumber END) AS fldDebtAccountNumber5
        , MAX(CASE WHEN row = 5 THEN d.fldEnrolledDebt END) AS fldEnrolledDebt5
        , MAX(CASE WHEN row = 6 THEN d.fldCreditorName END) AS fldCreditorName6
        , MAX(CASE WHEN row = 6 THEN d.fldDebtAccountNumber END) AS fldDebtAccountNumber6
        , MAX(CASE WHEN row = 6 THEN d.fldEnrolledDebt END) AS fldEnrolledDebt6
    FROM
    (
      SELECT @row := CASE WHEN tblClients_fldDRCClientID = @id 
          THEN @row + 1 ELSE 1 END as row 
        , @id := tblClients_fldDRCClientID as IndividualNumber
          , inf.fldCreditorName
          , inf.fldDebtAccountNumber
          , inf.fldEnrolledDebt
      FROM (SELECT @row := 0, @id := 0) v
        , tblDebtAccountNumber as inf 
      ORDER BY inf.tblClients_fldDRCClientID
    ) d 
    GROUP BY d.IndividualNumber
) grp
    ON grp.IndividualNumber = idt.fldDRCClientID
;

SQL Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多