0

我正在处理一个语句查询,该查询必须在一行中显示所有具有相同 BT_ID 的数据,但在不同的 UF 字段下。例如,我有多个具有相同 BT_ID 的订单,并且需要在其自己的 UF 字段中显示每个 Invoice_reference 编号。但是,我没有将所有数据都转移到我的 UF 字段中。许多不应该为空白的字段都是空白的。任何帮助都是appriciated,谢谢:

DECLARE
@OrgCode varchar(5), @FromDate varchar(15)


Set @OrgCode = 'iho' Set @FromDate = '08/23/2013'


SELECT     Invoice.BT_ID,  
           Name.COMPANY, 
           Name.COMPANY_RECORD, 
           Name.COMPANY_SORT, 
           Name.LAST_FIRST, 
           Name.FULL_NAME, 
           Name_Address.PURPOSE, 
           Name.TITLE, 
           Name_Address.FULL_ADDRESS, 
           Invoice.INSTALL_BILL_DATE, 
           Org_Control.OrgName, 
           Org_Control.InvoiceAddress, 
           CONVERT(VARCHAR, Invoice.INVOICE_DATE, 101)AS INVOICE_DATE, 
           CONVERT(VARCHAR, Trans.TRANSACTION_DATE, 101)AS TRANSACTION_DATE, 
           Trans.POSTED,
           Invoice.CUSTOMER_REFERENCE, 
           Invoice.INVOICE_TYPE, 
           Org_Control.OrgCode, 
           Name.EMAIL,
           MAX(CASE WHEN rk = 1  THEN '</td>'+ cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF6,
           MAX(CASE WHEN rk = 2  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF7,
           MAX(CASE WHEN rk = 3  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF8,
           MAX(CASE WHEN rk = 4  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF9,
           MAX(CASE WHEN rk = 5  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF10,
           MAX(CASE WHEN rk = 6  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF11,
           MAX(CASE WHEN rk = 7  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF12,
           MAX(CASE WHEN rk = 8  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF13,
           MAX(CASE WHEN rk = 9  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF14,
           MAX(CASE WHEN rk = 10  THEN '<td>' + cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
cast(Trans.INVOICE_CHARGES as varchar) +'</td>' else '' END) as UF15
            FROM (SELECT INVOICE_REFERENCE_NUM,INVOICE_CHARGES,INVOICE_CREDITS,TRANSACTION_DATE,POSTED,
ROW_NUMBER() OVER(PARTITION BY BT_ID ORDER BY BT_ID) AS rk        

FROM         Trans) AS Trans INNER JOIN
             Invoice AS Invoice ON Trans.INVOICE_REFERENCE_NUM = Invoice.REFERENCE_NUM LEFT OUTER JOIN
             Name AS Name ON Invoice.BT_ID = Name.ID LEFT OUTER JOIN
             Org_Control AS Org_Control ON Invoice.ORG_CODE = Org_Control.OrgCode INNER JOIN
             Name_Address AS Name_Address ON Name.BILL_ADDRESS_NUM = Name_Address.ADDRESS_NUM WHERE     (Invoice.INVOICE_TYPE <'PP') AND
(Invoice.INVOICE_NUM <0) AND (Trans.TRANSACTION_DATE BETWEEN
@FromDate AND GETDATE()) AND 
                      (Org_Control.OrgCode = @OrgCode) AND (Trans.INVOICE_CHARGES>0)
                       GROUP BY TRANSACTION_DATE,Trans.posted,Invoice.BT_ID,Name.COMPANY,
         Invoice.INVOICE_DATE,Name.COMPANY_RECORD,Name.COMPANY_SORT,Name.LAST_FIRST,Name.FULL_NAME,Name_Address.PURPOSE,Name.TITLE,Name_Address.FULL_ADDRESS,
         Invoice.INSTALL_BILL_DATE,Org_Control.OrgName,Org_Control.InvoiceAddress,Invoice.CUSTOMER_REFERENCE,Invoice.INVOICE_TYPE,Org_Control.OrgCode,Name.EMAIL
4

1 回答 1

0

显然,这个查询非常复杂,我认为这就是为什么您到目前为止还没有任何答案的原因。这里有一些危险信号(a)几乎不可能理解查询的内容,并且(b)建议使用完全不同的方法进行完全重写。

在警告标志中:

  1. 任何在 GROUP BY 子句中包含 19 个字段的查询都已经迷路了。
  2. INNER JOINS 和 LEFT JOINS 混杂在一起(见下面的讨论)
  3. 大量使用复制粘贴
  4. 格式/行缩进是一团糟

首先,关于 LEFT JOIN:

  1. 您已将 LEFT JOIN 包含到 WHERE 子句中引用的表 (Org_Control) 中......因为该表必须具有一个值才能通过 WHERE 标准,所以 LEFT JOIN 不会添加任何内容。
  2. 您已将 LEFT JOIN 包含到 Name 表中,该表在 BT_ID 上连接,这是列排列的主要驱动程序。查询中是否真的存在与正在连接的表不匹配的行?

接下来,关于查询的整体方法:

在 SQL Server 中,我觉得将这样一个臃肿的庞然大物分解为可管理、可理解、可测试的块的最清晰方法是使用公用表表达式 (CTE)。有关 CTE 的入门知识,请参阅http://www.4guysfromrolla.com/webtech/071906-1.shtml

此外,做你想做的最简单的方法 - 将结果集中的数据行转换为列 - 可能是使用数据透视表(参见http://blogs.msdn.com/b/spike/archive/ 2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

有了这两个构建块,到达你要去的地方的方法是这样的:

  • 从较小的、经过测试的部分开始(在这种情况下,Trans 和 Invoice 之间的 INNER JOIN),
  • 一旦您知道核心正在为您提供所需的数据,然后使用诸如 Name 和 Name_Address 之类的查找数据进行构建。

对于您的查询,一个可行的框架可能如下所示:

; WITH RowNumberedTrans AS (
  SELECT 
    INVOICE_REFERENCE_NUM, INVOICE_CHARGES, INVOICE_CREDITS, TRANSACTION_DATE, POSTED,
    ROW_NUMBER() OVER(PARTITION BY BT_ID ORDER BY BT_ID) AS rk
  FROM Trans
), UFLabeledTrans AS (
  SELECT 
    CASE rk
      WHEN 1 THEN 'UF6'
      WHEN 2 THEN 'UF7'
      -- etc
    END AS UFLabel,
    -- other fields
  FROM RowNumberedTrans
), TransactionsPerInvoice AS (
  SELECT 
    (
      '<td>' + 
      cast(Invoice.REFERENCE_NUM as varchar(10)) + '</td>' +
      cast(Invoice.DESCRIPTION as varchar(50)) + '</td>' + '$' +
      cast(Trans.INVOICE_CHARGES as varchar) +'</td>'
    ) AS UFValue,
    -- other fields
  FROM Invoice i
    INNER JOIN UFLabledTrans t ON i.REFERENCE_NUM = t.INVOICE
), InvoiceInfoInColumns AS (
  -- logic here to:
  -- * select from TransactionsPerInvoice
  -- * construct your pivot table spreading out UFValues computed above
  -- * do any grouping (should be on one or two fields at most)
  -- * etc.
), NameAddressLookup AS (
  -- INNER JOIN between Name and Name_Address
)
SELECT -- long list of columns
FROM TransactionsPerInvoice tpi 
  (LEFT? INNER?) JOIN NameAddressLookup nl ON tpi.BT_ID = nl.ID

祝你好运; 希望这足以让您朝着正确的方向开始。

于 2013-09-30T16:21:49.143 回答