【问题标题】:Make a query that show result in another column进行查询以在另一列中显示结果
【发布时间】:2017-05-23 13:19:23
【问题描述】:

我有一张这样的桌子:

id - name - referred_id - referred_name
1  - mark -   100  -      nick
2  - david-   100  -      nick 
3  - mat -    100  -      nick
4  - patrik-  101  -      robert
5  - mick -   101  -      robert

我使用此查询来显示引用名称的结果:

SELECT member_id,f_name,l_name,active_status,refered_by From Act_Reg where refered_by='nick'

查询运行良好并返回:

id - name
1  - mark
2  - david
3  - mat

现在,我想在网格中将结果显示为行和列:像这样

id - referred_id - referred_name - refers(name of refers)
1  -  100        - nick          - mark , david , mat
2  -  101        - robert        - patrik , mick

我的目标是任何作为报告介绍过的人,例如: 尼克介绍了马克,大卫,垫子 我使用访问作为数据库,谢谢大家

【问题讨论】:

  • 哪个 RDBMS? SQL-ServerMySQL 还是其他?
  • 您有一些基于您的样本数据的答案。我想知道 nick 和 robert 是否也有自己的 ID? IE。 referedId 是同一张表中其他人的 id?如果是这种情况,您可能会有其他答案
  • 我使用 access 2003
  • 有一个表有这个字段:id-name-referred_id-referred_name

标签: sql vb6


【解决方案1】:

SQL Server 立场。 (可能有更有效的方法,但方法相同)

SELECT  distinct
        referred_id,
        referred_name,

        STUFF((SELECT ', ' + data1.[name] 
        FROM tablename data1
        WHERE data1.referred_id = data.referred_id
        FOR XML PATH('')), 1, 1, '') [refers (name of refers)]


FROM    tablename data

在适用的情况下重命名您的表和别名。您示例中的 id 列不符合您想要的结果。

礼貌

https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/

【讨论】:

    【解决方案2】:

    由于您没有提及哪个 RDBMS,我正在为 SQL-Server 提供解决方案:

    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Id, 
           referred_id, 
           referred_name, 
           STUFF((SELECT ', ' + CAST(name AS VARCHAR(10)) [n]
             FROM TestTable 
             WHERE referred_id = t.referred_id
             FOR XML PATH(''), TYPE)
            .value('.','NVARCHAR(MAX)'),1,2,' ') name
    FROM TestTable t
    GROUP BY referred_id, referred_name;
    

    输出:

    Id  referred_id     referred_name   name
    1   100             nick            mark, david, mat
    2   101             robert          patrik, mick
    

    工作演示:http://rextester.com/ICC58106

    更新:

    如果您想将结果发送给特定的referred_user,则需要在GROUP BY 之前添加WHERE 子句:

    WHERE referred_name = 'nick'
    

    【讨论】:

    • 对不起,你能写查询来兼容访问吗?谢谢
    【解决方案3】:
    SELECT
        referred_id
        ,referred_name
        ,(
            SELECT SUBSTRING((
                SELECT 
                    ', ' + NAME
                FROM Act_Reg 
                WHERE REFERRED_ID = A.REFERRED_ID        
                FOR XML PATH('')),
            3,1000)
        ) [REFERS [NAME OF REFERES]
    FROM Act_Reg A
    -- INSERT WHERE CLAUSE HERE, IF NEEDED
    GROUP BY referred_id, referred_name
    

    【讨论】:

      【解决方案4】:

      访问答案。感谢Combine values from related rows into a single concatenated string value

      SQL:

      SELECT distinct
      i.[referred_name],
      ConcatRelated(
          "[name]",
          "names",
      "[referred_name] = '" & [referred_name] & "'") AS Names
      FROM [names] AS i;
      

      创建一个模块并粘贴到提供的链接中提到的 ConcatRelated 方法中。 http://allenbrowne.com/func-concat.html

      我已经在 2002-2003 年的 access 上进行了测试并且可以工作。

      【讨论】:

      • 谢谢 Rob White,但是我使用 access 2003 作为数据库并且使用 vb6.vb6 无法识别“ConcatRelated”,我该怎么办?有没有办法通过另一个查询来达到我的目标?
      • 我所调查的所有内容都表明查询不是一个选项,但这并不是说我已经在线阅读了每一页,所以谁知道呢。我建议按原样提取数据,然后使用 vb 来构建您想要的结果。根据数据的大小,它可能会很慢且无法使用,但这由您自行决定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      相关资源
      最近更新 更多