【问题标题】:SQL STUFF statement wrong orderSQL STUFF 语句顺序错误
【发布时间】:2015-06-07 08:38:57
【问题描述】:

当我使用 STUFF 语句合并行时,它会按字母和数字对它们进行排序,这会导致值以不希望的顺序重新排列。 如何防止这种情况发生。

   STUFF ((SELECT '; ' + t2.[film name]
        FROM [filmbase].[dbo].[filmstowatch] t2
        WHERE t1.[Mobile Number] = t2.[Mobile Number]
        FOR XML PATH('')), 1,2,'') [film name],

   STUFF ((SELECT '; ' + t2.[customer No]
        FROM [filmbase].[dbo].[filmstowatch] t2
        WHERE t1.[Mobile Number] = t2.[Mobile Number]
        FOR XML PATH('')), 1,2,'') [customer no]
FROM temp.dbo.Temptable t1

例如,

原始数据:

客户编号:-1

电影名称:- 速度与激情

手机号码:- 123456789

客户编号:-2

电影名称:- 2 Fast 2 Furious

手机号码:- 123456789

客户编号:-3

电影名称:- 速度与激情东京漂移

手机号码:- 123456789

实际输出

Mobile Number:- 123456789, 
Film Name:- 2 Fast 2 Furious; Fast & Furious; Fast & Furious Tokyo Drift
Customer No:- 1;2;3 

期望的输出

Mobile Number:- 123456789, 
Film Name:- 2 Fast 2 Furious; Fast & Furious; Fast & Furious Tokyo Drift
Customer No:- 2;1;3 

我希望电影名称按照电影名称在所需输出示例中出现的顺序与客户编号匹配。

我认为代码应该是这样的

STUFF ((SELECT '; ' + t2.[film name]
        FROM [filmbase].[dbo].[filmstowatch] t2
        WHERE t1.[Mobile Number] = t2.[Mobile Number]
order by film_name /* and then here should be something that matches film name to customer no??*/
        FOR XML PATH('')), 1,2,'') [film name],

要得到 2F2F,f&f,f&fTD, 2,1,3 相反,我得到 2F2F,f&f,f&fTD, 1,2,3 这是我不想要的。

【问题讨论】:

  • STUFF 语句不进行任何重新排序。如果您想要订单,请将order by 添加到您的xml path 查询中。
  • 我不确定你是否知道我想要什么,但基本上在写完剧本后我想回到一行:手机号码、电影名称和客户号码。其中电影名称和客户名称具有各自的值:2f2f = 2, f&f=1, f&fTD = 3 ...而不是我得到 2f2f=1, f&f=2, f&fTD=3

标签: sql merge sql-server-2012 duplicate-data


【解决方案1】:

order by 添加到子查询以获得您想要的排序。例如,对于随机排序:

STUFF((SELECT '; ' + t2.[film name]
       FROM [filmbase].[dbo].[filmstowatch] t2
       WHERE t1.[Mobile Number] = t2.[Mobile Number]
       ORDER BY NEWID()
       FOR XML PATH('')
      ), 1, 2, ''
     ) as [film name],

我无法从问题中看出您真正想要的顺序。

【讨论】:

  • 我想展示 2 fast 2 furious = 2 and fast & furious = 1 and fast and furious tokyo drift = 3
  • 但脚本将 2f2f、f&f、f&fTD 的顺序设置为 1;2;3,而它应该是 2f2f、f&f、f&fTD 的顺序为 2;1;3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多