【问题标题】:Complex join with coalesce与合并的复杂连接
【发布时间】:2012-08-19 11:42:04
【问题描述】:

我有一个表,我将人口统计信息填充到其中,然后使用动态 sql 从中构建一个表。人口统计信息来自调查,一些调查带有复选框。使用复选框,人们可以选择多个值。

所以我需要以逗号分隔的列表形式输入所有选项。

CREATE TABLE Demographics 
  (
    QID NVARCHAR(15)
    ,userid NVARCHAR(50)
    ,question NVARCHAR(800)
    ,choice NVARCHAR(1000)
  )
...
...
--Demographics(QID,userid,question,choice)
--'Insert checkbox (type 5)
INSERT INTO Demographics
SELECT CAST(q.QID AS NVARCHAR(15))
    ,ri.userid
    ,q.QuestionText
    ,ac.Choice
FROM ResponseInfo ri --response details
JOIN Responses r ON ri.ResponseID = r.ResponseID --actual response
JOIN Questions q ON r.QID = q.QID --question info
JOIN AnswerChoices ac ON r.QID = ac.QID --answer choice text
WHERE (q.QuestionTypeID = 5 AND q.QID = ac.QID
AND r.IsOther = 0 
AND q.QID = 16
)
AND ri.userid IN (SELECT userid FROM @Users) AND r.Response = ac.Sequence
ORDER BY ri.userid
...
dynamic sql stuff
...
EXEC sp_exesql @sql

我的结果如下所示:

users | question_15 | choice_15 | question_16     | choice_16 |
bill  | age?        | 37        | favorite color? | red       |
bill  | age?        | 37        | favorite color? | green     |

但它必须是:

users | question_15 | choice_15 | question_16     | choice_16 |
bill  | age?        | 37        | favorite color? | red,green |    

我试过了

,COALESCE(ac.Choice + ',','') + ac.Choice

它给了我

bill  | age?        | 37        | favorite color? | red,red   |

谁能帮我解决这个问题?

【问题讨论】:

  • choice_16 可以有多少个可能的值?
  • 在这种情况下我认为是 8。这是“你是不是西班牙裔?”之一。哦,无论哪种方式“单击适用于您的每个种族”。 “拒绝回答”始终是一种选择。

标签: sql sql-server-2005 join coalesce


【解决方案1】:

看起来您正在使用 SQL Server。如果您使用的是最新版本的 SQL Server(例如,SQL Server 2005 或更高版本),您最好将数据存储为 XML。

这让您可以在 SQL 中使用 XPATH/XQUERY 来操作 XML 数据以获得您想要的。我想你会发现这样做更容易。

【讨论】:

    【解决方案2】:

    Found this.

    非常有帮助。我的代码可能需要进行一些清理。

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 1970-01-01
      • 2013-10-01
      • 2011-11-21
      • 2016-07-13
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多