【问题标题】:How To use generate row number with group by option如何使用 group by 选项生成行号
【发布时间】:2017-08-11 10:14:02
【问题描述】:

输入表 DEDUPE

SOURCE  Legacy_vendor   Vendor  Condition application   Condition type  Doc type    
MX_PRISMA_PDN   9215217 1012473 EF                   ZNE1             ZMRO  
MX_PRISMA_PDN   9215217 1012473 EF                   ZNE1             ZNB   
MX_PRISMA_PDN   9215217 1012473 EF                   ZNE1             ZSRM  

输出应该是这样的

SOURCE  Legacy_vendor   Vendor  Condition application   Condition type  Doc type    
MX_PRISMA_PDN   9215217 1012473 EF                   ZNE1      ZMRO,ZNB,ZSRM     

【问题讨论】:

  • 您使用的是什么 DBMS?
  • •关系数据库
  • Oracle、MySQL、PostgreSQL 等?
  • 您需要告诉我们您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 我正在使用 MYSQL

标签: sql string-aggregation


【解决方案1】:

假设 SQL Server:您可以使用 XMLStuff 来做到这一点

SELECT DISTINCT SOURCE,Legacy_vendor,Vendor,[Condition application],[Condition type],STUFF((SELECT ','+[Doc type]

            FROM Table1 T1
             WHERE T1.SOURCE=T2.SOURCE
                AND T1.Legacy_vendor=T2.Legacy_vendor
                AND T1.Vendor=T2.Vendor
             FOR XML PATH('')
            ), 1, 1, '')
             AS [Doc type]
FROM Table1 T2

Demo

【讨论】:

    【解决方案2】:

    对于 SQL Server

    select source, legacy_vendor, vendor, condition_application, condition_type,
    doctype = 
     STUFF((    SELECT ' '+ SUB.doctype AS [text()]  
    FROM DEDUPE SUB  
    WHERE  sub.source = main.source and  sub.legacy_vendor = main.legacy_vendor and
           sub.vendor = main.vendor and sub.condition_application= main.condition_application and sub.condition_type = main.condition_type
    FOR XML PATH('') 
    ), 1, 1,'')  
     from DEDUPE main
     group by source, legacy_vendor, vendor, condition, condition_type
    

    我使用 STUFF 将所有文档类型加入 1 列中

    【讨论】:

    • 这是用于哪个 dbms?
    【解决方案3】:

    您没有告诉我们您的 DBMS。

    对于 PostgreSQL,您可以使用 string_agg()

    select source, 
           Legacy_vendor, 
           Vendor, 
           "Condition application"
           "Condition type"
            string_agg("Doc type", ',') as doc_type
    from the_table
    group by source, 
           Legacy_vendor, 
           Vendor, 
           "Condition application"
           "Condition type"
    

    【讨论】:

      【解决方案4】:
      BEGIN TRAN
      CREATE TABLE  #DEDUPE (SOURCE NVARCHAR(50),Legacy_vendor BIGINT,Vendor BIGINT ,[Condition application]  NVARCHAR(10),[Condition type] NVARCHAR(20),[Doc type]  NVARCHAR(20))
      
      
      INSERT INTO #DEDUPE
      SELECT 'MX_PRISMA_PDN' ,9215217, 1012473,'EF','ZNE1','ZMRO' UNION ALL
      SELECT 'MX_PRISMA_PDN', 9215217, 1012473,'EF','ZNE1','ZNB' UNION ALL
      SELECT 'MX_PRISMA_PDN', 9215217, 1012473,'EF','ZNE1','ZNB' 
      
      
          SELECT
          C.SOURCE,
          C.Legacy_vendor,C.Vendor,C.[Condition application],C.[Condition type],
              STUFF((  
                      SELECT  ', ' +  CONVERT(Nvarchar,CP.[Doc type])
                      FROM  
                      #DEDUPE CP
                      WHERE
                          C.SOURCE = CP.SOURCE
                          FOR XML PATH('')), 1, 2, '') [Doc type]
          FROM
          #DEDUPE C 
          GROUP BY    C.SOURCE,
          C.Legacy_vendor,C.Vendor,C.[Condition application],C.[Condition type]
      
      DROP TABLE #DEDUPE
      ROLLBACK TRAN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2015-04-15
        • 1970-01-01
        相关资源
        最近更新 更多