【问题标题】:Concatening rows to columns in SQL Query issue将行连接到 SQL 查询问题中的列
【发布时间】:2015-01-30 15:46:18
【问题描述】:

我对以下查询结果有疑问。我想将每个客户的 product_number 连接在它自己的列中,只为每个客户显示一行。客户列是一个 varchar。我尝试使用 STUFF 和 FOR XML Path,但没有得到我想要的结果。

它在 PRODUCTS 列中为我提供了每个产品编号,因此我不是获取每个公司的产品,而是获取整个列表或每个产品行。

SELECT customer_number
  ,first_name_initial
  ,last_name
  ,billing_address_line_1
  ,billing_city
  ,zip_code
  ,phone_number1
  ,email1
  ,STUFF((SELECT ', ' + product_number
  FROM #TempS
  FOR XML PATH ('')), 1, 1, '') [PRODUCTS]
FROM #TempS
GROUP BY customer_number
  ,first_name_initial
  ,last_name
  ,billing_address_line_1
  ,billing_city
  ,zip_code
  ,phone_number1
  ,email1
ORDER BY customer_number

我希望每行的每个公司都如下所示(为了便于阅读,我缩短了)。

提前致谢。

ROWID customer company  address city  zip_code phone_number email1   PRODUCTS
1     1255400  Company1 CAdd1   City1 10001    111-111-1111 e@c.com  01002, 09999, 09002 091111, 00005     

"

这成功了。

SELECT customer_number,
       first_name_initial,
       last_name,
       billing_address_line_1,
       billing_city,
       zip_code,
       phone_number1,
       email1,
       Stuff((SELECT ',' + CONVERT(VARCHAR(5), product_number)
              FROM   #tempsales t2
              WHERE  t1.customer_number = t2.customer_number
                     AND t2.product_number > ''
              FOR xml path('')), 1, 1, '') [Products]
FROM   #tempsales t1
GROUP  BY customer_number,
      first_name_initial,
      last_name,
      billing_address_line_1,
      billing_city,
      zip_code,
      phone_number1,
      email1,
ORDER  BY customer_number

谢谢。

【问题讨论】:

  • 选择中缺少条件,这就是为什么您要获得所有产品,试试这个: STUFF((SELECT ', ' + product_number FROM #TempS WHERE fk_customer_number = customer_number FOR XML PATH ('' )), 1, 1, '') [产品]
  • #TempS 是临时表,所以没有 fk(我认为这是准确的)。

标签: sql sql-server concatenation rows for-xml-path


【解决方案1】:

试试这个:

DECLARE @t TABLE
    (
      ID INT ,
      cust INT ,
      prod NVARCHAR(4)
    )

INSERT  INTO @t
VALUES  ( 1, 1, '0001' ),
        ( 2, 1, '0002' ),
        ( 3, 1, '0003' ),
        ( 4, 1, '0004' ),
        ( 5, 2, '0001' ),
        ( 6, 2, '0002' ),
        ( 7, 2, '0003' ),
        ( 8, 3, '0001' ),
        ( 9, 3, '0002' ),
        ( 10, 3, '0003' )


SELECT  t1.cust ,
        STUFF((SELECT   ', ' + prod
               FROM     @t t2
               WHERE    t2.cust = t1.cust
        FOR   XML PATH('') ,
                  TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM    @t t1
GROUP BY t1.cust

输出:

cust    prod
1       0001, 0002, 0003, 0004
2       0001, 0002, 0003
3       0001, 0002, 0003

【讨论】:

    【解决方案2】:

    我必须更改 FOR XML 标准才能使其正常工作。上面的完整查询。

    Stuff((SELECT ',' + CONVERT(VARCHAR(5), product_number)
              FROM   #tempsales t2
              WHERE  t1.customer_number = t2.customer_number
                     AND t2.product_number > ''
              FOR xml path('')), 1, 1, '') [Products]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2014-06-04
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多