SQL - 从授权列表中汇总所有产品类型

时间:2017-06-02 23:29:30

标签: sql sql-server-2008 summary

我试图找出如何显示每个客户可以与我们订购的订单类型。我们有以下表格CLIENTS,CLIENT_SERVICE_TYPE,SERVICE_TYPES,PRODUCT_TYPE

我们有许多服务类型,可以很容易地与水果和蔬菜相关联。

  

客户 - 列出我们所有的客户    CLIENT_SERVICE_TYPE - 列出他们被授权放置的所有服务类型(苹果,梨,香蕉,壁球,鸡肉)。
   SERVICE_TYPES - 列出我们提供的数百种水果和蔬菜(其中,每个客户只能从中选择一些。)    PRODUCT_TYPE列出了我们提供的5个类别(IE水果,蔬菜,香料,奶制品,肉类)

我希望能够创建一个显示某些客户端的摘要报告

公司名称|销售代表| 产品类型
公司ABC |简史密斯| 水果
公司XYZ | Joe Aardvark | 蔬菜,水果
公司123 |艾米亚当斯| 肉类,蔬菜,水果

在上面的例子中,ABC公司有15种授权水果(香蕉,苹果,橙子等),但总结为1在一行水果。公司XYZ拥有相同的15个授权水果和1个胡萝卜。我希望它在同一条线上显示为蔬菜,水果(顺序并不重要)。 123公司仅获得4项服务(鸡肉,香蕉,豌豆和南瓜)。 肉类,蔬菜,水果

我知道找到现有教程可能很简单,但我的术语显然不符合标准。这是我得到的,你可能猜到,它为他们批准的X服务类型显示了多行。

SELECT
    company [Client Name]
    ,salesperson [Sales Rep]
    --,pt.productTypeName [List of approved Product Types]
    FROM CLIENT cl (NOLOCK)
        LEFT JOIN
    CLIENT_SERVICE_TYPE cst (NOLOCK) = cl.client_key = cst.client_key
        LEFT JOIN
    SERVICE_TYPE st (NOLOCK) = cst.service_key = st.service_key
        LEFT JOIN
    PRODUCT_TYPE pt (NOLOCK) = cst.productTypeId = pt.productTypeId
WHERE cl.client_program_id in (1,2,3)
    and status = 160
ORDER BY company

1 个答案:

答案 0 :(得分:0)

通过反复试验找到答案。在SELECT语句中,我就是这样做的

SELECT
company as [Company Name]
,salesperson as [Sales Rep]
,(STUFF((SELECT CAST(', ' + productTypeName AS VARCHAR(MAX))
    FROM CLIENT_SERVICE_TYPE cst
        LEFT JOIN
    SERVICE_TYPE st on cst.service_type_key = st.service_type_key
        LEFT JOIN
    PRODUCT_TYPE pt on st.product_type_key = pt.product_type_key
    WHERE c.client_key = cst.client_key
    GROUP BY pt.product_type_name
    FOR XML PATH ('')),1,2, '')) [Product Types]
FROM CLIENT c

最终结果
公司名称|销售代表|产品类型
公司ABC |简史密斯| 水果
公司XYZ | Joe Aardvark | 蔬菜,水果
公司123 |艾米亚当斯| 肉类,蔬菜,水果