【问题标题】:Add multiple varchar columns (subquery/loop?)添加多个 varchar 列(子查询/循环?)
【发布时间】:2013-06-09 04:45:30
【问题描述】:

我有 3 个表格,我正在尝试创建报告...

Table MP (data table)
mID col1    col2
1   data1   data2
2   data3   data4
3   data5   data6

Table MPU (user table)
uID UserName
1   user1
2   user2
3   user3

Table MPR (lookup table)
rID uID mID
1   1   2
2   2   2
3   1   1

这是我需要的基本选择逻辑:

Select
    MP.mID
    ,MP.col1
    ,MP.col2
    ,MPU.UserName --format as 'user1, user2, user3' ...
From MP
left join MPR on MPR.mID  = MP.mID
left join MPU on MPU.uID = MPR.uID

我需要按照代码中的注释将用户名字符串添加到一起。
一些数据行将没有用户,而其他数据行可能有多达 10 个。
我不希望像现在这样填充多行。

编辑:
注意 - SQL 2000

【问题讨论】:

  • 您可能想尝试 COALLESCE.. 它将所有非空用户名汇集在一起​​...我将不得不查找格式并稍后发布
  • 有多种解决方案,例如this,用于创建逗号分隔列表。仅供参考:您的示例 MP 表没有 rID 列,但您的查询使用它。
  • 该解决方案仅适用于 2005 年及更新版本。我很幸运能在 2000 年工作。-也固定加入。

标签: sql tsql sql-server-2000


【解决方案1】:

我只能为 MSSQL 2000 建议这种方法:

select
    mID,
    col1,
    col2,
    MAX( CASE seq WHEN 1 THEN UserName ELSE '' END )  +
    MAX( CASE seq WHEN 2 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 3 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 4 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 5 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 6 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 7 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 8 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 9 THEN ', '+UserName ELSE '' END ) + 
    MAX( CASE seq WHEN 10 THEN ', '+UserName ELSE '' END ) 

FROM (
    Select
        MP1.mID,
        MP1.col1,
        MP1.col2,
        MPU1.UserName,
        (
            SELECT COUNT(*)
            From MP as MP2
            left join MPR as MPR2 on MPR2.mID  = MP2.mID
            left join MPU as MPU2 on MPU2.uID = MPR2.uID
            WHERE MP2.mID = MP1.mID
            AND MPU2.UserName <= MPU1.UserName
        ) seq
    From MP as MP1
    left join MPR as MPR1 on MPR1.mID  = MP1.mID
    left join MPU as MPU1 on MPU1.uID = MPR1.uID
) t1
GROUP BY mID, col1, col2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多