显示查询结果平铺(Displaying Query Results Horizontally)

2019-10-30 06:52发布

我想知道是否可以采取查询的结果,并返回将其作为CSV字符串,而不是作为一列单元格。

基本上,我们有一个名为Customers表,我们有一个名为CustomerTypeLines表,每个客户可以有多个CustomerTypeLines。 当我对它运行一个查询时,我遇到问题时,我要检查多种类型,例如:

    Select * 
      from Customers a 
Inner Join CustomerTypeLines b on a.CustomerID = b.CustomerID 
     where b.CustomerTypeID = 14 and b.CustomerTypeID = 66

......没有返回值,因为客户不能同时在同一条线上,效果显着。

为了使它的工作,我有一个字段添加到一个名为CustomerTypes看起来像客户,14,66,67,所以我可以做一个Where a.CustomerTypes like '%,14,%' and a.CustomerTypes like '%,66,%'返回85行。

当然,这是一种痛苦,因为我有我的程序每个CustomerTypeLines表改变时重建这个领域为客户。

这将是很好,如果我可以做一个子查询我哪里会做的工作对我来说,这样的而不是返回的结果,如:

14
66
67

它会返回他们喜欢,14,66,67,

这可能吗?

Answer 1:

你会碰到各种各样的做一个问题LIKE一个逗号分隔的列表上查询。 我知道,我一直在那里。

例如,如果你搜索'%,14,%' ,会发生什么,如果14是在列表中的第一个或最后一个项目? (我知道你指定额外的前导和尾随逗号,但COALESCE方法不提供这些。)

这个怎么样,而不是:

Select * from Customers a 
Inner Join CustomerTypeLines b 
on a.CustomerID = b.CustomerID 
WHERE a.CustomerID in 
    (SELECT customerID from CustomerTypeLines
     WHERE CustomerTypeID = 14)
AND a.CustomerID in
    (SELECT customerID from CustomerTypeLines
     WHERE CustomerTypeID in 66)

编辑以解决问题的overhasty阅读!



Answer 2:

要做到这一点,而不denormalising可以使用类似下面的东西把所有的IN子句,然后可以加入对匹配的所有值的客户的表。

SELECT CustomerId 
FROM CustomerTypes
WHERE CustomerTypeID in (14, 66)
GROUP BY CustomerId
HAVING COUNT(DISTINCT CustomerTypeID) = 2

事实上,你在你的问题,你已经有一个返回的结果类似的查询:

14
66
67

这是按照已经正确的格式关系分割技术 。

SELECT * 
FROM Customers c
    WHERE NOT EXISTS
    (
        SELECT * FROM @YourQuery y
        WHERE NOT EXISTS
            (
            SELECT * FROM CustomerTypeLines ctl
            WHERE ctl.CustomerTypeID = y.CustomerTypeID
            AND c.CustomerID = ctl.CustomerID
            )
        )


Answer 3:

我相信你正在寻找该技术将利用的COALESCE功能。 见http://www.4guysfromrolla.com/webtech/092105-1.shtml 。



Answer 4:

如果你想要得到谁同时拥有14和66,那么你可以使用所有的客户:

SELECT
    C.CustomerID,
    C.SomeColumn
FROM
    Customers C
WHERE
    EXISTS (SELECT * FROM CustomerTypes CT1 WHERE CT1.CustomerID = C.CustomerID AND CT1.CustomerTypeID = 14) AND
    EXISTS (SELECT * FROM CustomerTypes CT2 WHERE CT2.CustomerID = C.CustomerID AND CT2.CustomerTypeID = 66)

一个更通用的解决方案(以获取基于任何数量的客户类型ID的客户将取决于你是如何传递这些ID,以SQL(例如,作为表paramater到一个存储过程)。



Answer 5:

这是一个痛苦,因为你的设计是错误的。

由于客户有一个与CustomerType一对多的关系,您应该创建另一个表来存储,而不是在一个场干扰所有这些值的值。 这样,你就可以查询这些值很多更加简单快捷。

然后你可以使用FOR XML PATH子句以逗号分隔的记录http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist



文章来源: Displaying Query Results Horizontally