2013-09-26 16 views
0

令我在statments查询有一个线,但根据不同的UF场,以显示与同一BT_ID所有数据的工作。例如,我有多个具有相同BT_ID的订单,并且需要在其自己的UF字段中显示每个Invoice_reference编号。 但是我没有把所有的数据都传到我的UF字段。许多领域都认为不可空白。任何帮助appriciated,谢谢:SQL查询,以显示在同一行同一ID,但其自身的UF场

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 

回答

0

显然这个查询是相当复杂的,我想这是为什么你还没有的任何答案了。这里有一些红旗,(a)几乎不可能理解查询的内容,(b)建议使用完全不同的方法进行完全重写。

其中警告标志:

  1. 在GROUP BY子句中19场的任何查询已经失去了沿线地方道路。
  2. 有内蒙古一个大杂烩连接和左连接(见下面的讨论)
  3. 大量使用复制和粘贴的
  4. 格式/行缩进的是一个烂摊子

首先,对左侧的连接:

  1. 您已经包括LEFT JOIN到在引用的表(Org_Control)WHERE子句......由于该表必须有一个值,以便通过WHERE条件, LEFT JOIN什么都不加。
  2. 您在名称表中包含了一个LEFT JOIN,该表中加入了BT_ID,它是列排列的主要驱动程序。实际上查询中的行可能不匹配正在连接的表之间的行吗?

接下来,作为整体的方法来查询:

在SQL Server中,我觉得击穿最清晰的方式这样成可管理的,可以理解的,可测试块臃肿的庞然大物与通用表表达式(热膨胀系数)。有关CTE的引物,请参阅http://www.4guysfromrolla.com/webtech/071906-1.shtml

而且,有可能是最简单的方法做你want--什么从结果集到columns--转换数据的行与数据透视表(见http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

随着这两个积木的地方,让你要去的地方的方式是这样的:

  • 从小开始,试验件(在这种情况下,内部跨和发票之间的连接),
  • 然后建立与查找数据,如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 

运气好;希望这足以让你开始正确的方向。

相关问题