2015-02-19 5 views
0

У меня есть довольно простой запрос, который по существу возвращает SUM всего для сети счетов-фактур для каждого клиента, где была предоставлена ​​определенная скидка.Список разделенных запятыми

Как часть этого, я хочу вернуть номера счетов, к которым применяется каждая скидка, в виде списка, разделенного запятыми.

Это важно, поскольку оно подается в другую часть программного обеспечения, которая принимает данные только в этом формате.

Я мог бы форматировать в Excel, так как это приведет к тому, что данные закончатся, однако я предпочел бы сделать это непосредственно в запросе.

Я получаю свою голову путаной, пытаясь использовать функцию FOR XML PATH для этого.

Ниже приводится текущий запрос, который возвращает одну строку для каждого Discount Group, клиент, скидка% учитывая при сумме составляет

поле для номера счета-фактуры является invoice_header.ih_number

SELECT variant_discount_group.vdg_node_path AS 'Discount Group' , 
     customer_detail.cd_statement_name AS 'Customer Name' , 
     invoice_line_item.ili_discount_percent AS 'Discount' , 
     SUM((CASE WHEN invoice_header.ih_credit = 1 THEN -1 
        ELSE 1 
       END) * invoice_line_item.ili_qty) AS 'Qty' , 
     SUM((CASE WHEN invoice_header.ih_credit = 1 THEN -1 
        ELSE 1 
       END) * invoice_line_item.ili_net) AS 'Total Net' 
FROM invoice_header 
     JOIN invoice_line_item ON invoice_line_item.ili_ih_id = invoice_header.ih_id 
     JOIN variant_detail ON variant_detail.vad_id = invoice_line_item.ili_vad_id 
     JOIN variant_setting ON variant_setting.vas_vad_id = variant_detail.vad_id 
     JOIN customer_detail ON customer_detail.cd_id = invoice_header.ih_cd_id 
     LEFT JOIN variant_discount_group ON variant_discount_group.vdg_id = variant_setting.vas_vdg_id 
WHERE invoice_header.ih_datetime BETWEEN @DateFrom 
            AND  @DateTo 
     AND ISNULL(variant_discount_group.vdg_node_path, '') LIKE @VDGroup 
     + '%' 
     AND invoice_line_item.ili_discount_percent BETWEEN @DiscFrom 
                AND @DiscTo 
GROUP BY variant_discount_group.vdg_node_path , 
     customer_detail.cd_statement_name , 
     invoice_line_item.ili_discount_percent 
ORDER BY variant_discount_group.vdg_node_path , 
     customer_detail.cd_statement_name , 
     invoice_line_item.ili_discount_percent 
+0

вы можете обеспечить выборки данных – sam

ответ

1

попробовать это

WITH cte 
      AS (SELECT variant_discount_group.vdg_node_path AS [Discount Group] , 
         customer_detail.cd_statement_name AS [Customer Name] , 
         invoice_line_item.ili_discount_percent AS [Discount] , 
         (CASE WHEN invoice_header.ih_credit = 1 THEN -1 
           ELSE 1 
          END) * invoice_line_item.ili_qty AS [Qty] , 
         (CASE WHEN invoice_header.ih_credit = 1 THEN -1 
           ELSE 1 
          END) * invoice_line_item.ili_net AS [Total Net] , 
         invoice_header.ih_number AS [invoice] 
       FROM  invoice_header 
         JOIN invoice_line_item ON invoice_line_item.ili_ih_id = invoice_header.ih_id 
         JOIN variant_detail ON variant_detail.vad_id = invoice_line_item.ili_vad_id 
         JOIN variant_setting ON variant_setting.vas_vad_id = variant_detail.vad_id 
         JOIN customer_detail ON customer_detail.cd_id = invoice_header.ih_cd_id 
         LEFT JOIN variant_discount_group ON variant_discount_group.vdg_id = variant_setting.vas_vdg_id 
       WHERE invoice_header.ih_datetime BETWEEN @DateFrom 
                AND  @DateTo 
         AND ISNULL(variant_discount_group.vdg_node_path, '') LIKE @VDGroup 
         + '%' 
         AND invoice_line_item.ili_discount_percent BETWEEN @DiscFrom 
                   AND 
                   @DiscTo 
      ) 
    SELECT a.[Discount Group] , 
      a.[Customer Name] , 
      a.[Discount] , 
      SUM(a.[Qty]) AS Qty , 
      SUM(a.[Total Net]) AS [Total Net] , 
      SUBSTRING((SELECT ', ' + CONVERT(VARCHAR, b.[invoice]) 
         FROM (SELECT DISTINCT 
             [invoice], 
             [Discount Group], 
             [Customer Name], 
             [Discount] 
           FROM cte) AS b 
         WHERE a.[Discount Group] = b.[Discount Group] 
           AND a.[Customer Name] = b.[Customer Name] 
           AND a.[Discount] = b.[Discount] 
         FOR 
         XML PATH('') 
        ), 2, 1000) AS [List of invoices] 
    FROM cte AS a 
    GROUP BY a.[Discount Group] , 
      a.[Customer Name] , 
      a.[Discount] 
    ORDER BY a.[Discount Group] , 
      a.[Customer Name] , 
      a.[Discount] 
+0

Работает быстро и отлично работает. Гораздо лучше, чем моя попытка. – OWSam

+0

Собственно, одно. Если в одной и той же группе скидок находятся 2 пункта одной группы счетов, номер счета-фактуры повторяется в подстроке. – OWSam

+0

Ответ @OWSam был обновлен – Vasily

0

Я не знаете о проблемах с производительностью, но вы можете создать функцию, возвращающую VARCHAR. Вызовите эту функцию в своем заявлении select и в качестве параметра дайте ссылку на свои invoicenumbers.

В функции вы бы указали курсор для всех строк Invoicenumbers и перебирали его и объединяли в возвращаемое значение.

Это, вероятно, быстрое и грязное и интенсивное использование ресурсов.

+0

я не могу создавать функции на БД, к сожалению. – OWSam

+0

подумав об этом, вы могли бы, вероятно, развернуть строки для invoicenumber и просто конкатрировать их в своем выборе. [link] https://technet.microsoft.com/de-de/library/ms177410%28v=sql.105%29.aspx?f=255&MSPPError=-2147217396 [/ link] – Clevemayer

+0

Я не знаю, сколько счетов номера будут. Это может быть 1, может быть 50. – OWSam

Смежные вопросы