为什么此SQL Server查询会产生排序规则冲突

时间:2013-10-21 18:53:03

标签: sql-server tsql

我很难搞清楚为什么这个查询会在分组中产生排序错误。 我把它缩小到一个特定的案例陈述。它以一种方式工作(结果为字符串)但是当我尝试替换另一个表中的一个字段(它自己表现得很好)时会抛出整理错误。

以下代码运行正常。

Declare @StartDate Date = '09/01/2013';
Declare @EndDate Date = Getdate();

With Invoice as (
        SELECT     
         a.DocEntry
        ,a.DocDate
        ,a.CardCode
        ,a.CardName
        ,a.U_CXS_FMST
        ,a.U_CXS_FRST
        ,a.U_DBS1StoreID
        ,CASE
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 3 then 2
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 4 then 3
            when a.DocDate >= '08/01/2011' then isnull(U_CXS_FMST,U_DBS1StoreID)
        end as CompleteStores
        ,d.description StoreName
        ,CASE a.U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(a.U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(a.U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE a.CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
        ,a.NumAtCard
        ,a.U_TransactionID
        ,a.U_SalesSource
        ,s.Name
        ,b.LineNum
        ,b.ItemCode
        ,c.ItemName
        ,c.CstGrpCode
        ,c.U_WebName
        ,c.U_SupplierCatNum
        ,c.CatCode
        ,c.CatName
        ,c.GroupCode
        ,c.GroupName
        ,c.DeptCode
        ,c.DeptName
        ,c.MfcCode
        ,c.Manufacturer
        ,Cast(b.Quantity as INT) Quantity
        ,b.Price
        ,b.PriceBefDi
        ,b.LineTotal
        ,b.GrossBuyPr
        ,a.DocTotal
        --,((Cast(b.Quantity as INT)* b.Price)-(Cast(b.Quantity as INT)*b.GrossBuyPr))/b.GrossBuyPr as MarginPCT

        FROM         
        MonkeySports.dbo.INV1 AS b 
        INNER JOIN 
        MonkeySports.dbo.OINV AS a ON a.DocEntry = b.DocEntry
        Inner Join
        dbo.MS_OITM_Categories as c ON b.ItemCode = c.ItemCode
        Inner Join
        [@SALESSOURCE] as s on a.U_SalesSource = s.Code
        left outer join
        CXSRetail.dbo.RtlStore d on 
        CASE
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = '3' then '2'
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = '4' then '3'
            when a.DocDate >= '08/01/2011' then isnull(U_CXS_FMST,U_DBS1StoreID)
        end = cast(d.siteid as Nvarchar)

        Where 
GrossBuyPr > 0.01
and
a.DocDate between @StartDate and @EndDate
) 
,Invoice1 as (
        Select 
         DocEntry
        ,DocDate
        ,CardCode
        ,CardName
        ,U_CXS_FMST
        ,U_CXS_FRST
        ,U_DBS1StoreID
        ,CompleteStores
        ,StoreName
        ,CASE U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
                    ,CASE
                WHEN iVend = 0 AND DBS = 0 AND Web = 0
                THEN 1
                ELSE 0
            END [Other]   
        ,NumAtCard
        ,U_TransactionID
        ,U_SalesSource
        ,Name
        ,LineNum
        ,ItemCode
        ,ItemName
        ,CstGrpCode
        ,U_WebName
        ,U_SupplierCatNum
        ,CatCode
        ,CatName
        ,GroupCode
        ,GroupName
        ,DeptCode
        ,DeptName
        ,MfcCode
        ,Manufacturer
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        ,DocTotal
        --,MarginPCT

        From Invoice    
        )
,Invoice2 as (      
    SELECT
        --DocEntry
         --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
          CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End SalesChnl   
          ,Case 
            When iVend = 1 OR DBS = 1 Then StoreName
            When Web = 1 Then 'Internet'
            When Other = 1 then 'Other' 
         End StoreName
        ,iVend
        ,DBS
        ,Web
        ,Other  
        --,NumAtCard
        --,U_TransactionID
        ,U_SalesSource
        ,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,MarginPCT
        --,DocTotal         
FROM Invoice1   

--Where GrossBuyPr = 0

Group By
        --DocEntry
        --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
        CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End    
        ,Case 
            When iVend = 1 OR DBS = 1 Then StoreName
            When Web = 1 Then 'Internet'
            When Other = 1 then 'Other'
         End
        ,iVend
        ,DBS
        ,Web
        ,Other  
        --,NumAtCard
        --,U_TransactionID
        ,U_SalesSource
        ,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,MarginPCT
        --,DocTotal   
        )
Select *
 from Invoice2

然而,当我尝试使用此代码时,它会抛出排序错误。

    Declare @StartDate Date = '09/01/2013';
Declare @EndDate Date = Getdate();

With Invoice as (
        SELECT     
         a.DocEntry
        ,a.DocDate
        ,a.CardCode
        ,a.CardName
        ,a.U_CXS_FMST
        ,a.U_CXS_FRST
        ,a.U_DBS1StoreID
        ,CASE
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 3 then 2
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 4 then 3
            when a.DocDate >= '08/01/2011' then isnull(U_CXS_FMST,U_DBS1StoreID)
        end as CompleteStores
        ,d.description StoreName
        ,CASE a.U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(a.U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(a.U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE a.CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
        ,a.NumAtCard
        ,a.U_TransactionID
        ,a.U_SalesSource
        ,s.Name
        ,b.LineNum
        ,b.ItemCode
        ,c.ItemName
        ,c.CstGrpCode
        ,c.U_WebName
        ,c.U_SupplierCatNum
        ,c.CatCode
        ,c.CatName
        ,c.GroupCode
        ,c.GroupName
        ,c.DeptCode
        ,c.DeptName
        ,c.MfcCode
        ,c.Manufacturer
        ,Cast(b.Quantity as INT) Quantity
        ,b.Price
        ,b.PriceBefDi
        ,b.LineTotal
        ,b.GrossBuyPr
        ,a.DocTotal
        --,((Cast(b.Quantity as INT)* b.Price)-(Cast(b.Quantity as INT)*b.GrossBuyPr))/b.GrossBuyPr as MarginPCT

        FROM         
        MonkeySports.dbo.INV1 AS b 
        INNER JOIN 
        MonkeySports.dbo.OINV AS a ON a.DocEntry = b.DocEntry
        Inner Join
        dbo.MS_OITM_Categories as c ON b.ItemCode = c.ItemCode
        Inner Join
        [@SALESSOURCE] as s on a.U_SalesSource = s.Code
        left outer join
        CXSRetail.dbo.RtlStore d on 
        CASE
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = '3' then '2'
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = '4' then '3'
            when a.DocDate >= '08/01/2011' then isnull(U_CXS_FMST,U_DBS1StoreID)
        end = cast(d.siteid as Nvarchar)

        Where 
GrossBuyPr > 0.01
and
a.DocDate between @StartDate and @EndDate
) 
,Invoice1 as (
        Select 
         DocEntry
        ,DocDate
        ,CardCode
        ,CardName
        ,U_CXS_FMST
        ,U_CXS_FRST
        ,U_DBS1StoreID
        ,CompleteStores
        ,StoreName
        ,CASE U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
                    ,CASE
                WHEN iVend = 0 AND DBS = 0 AND Web = 0
                THEN 1
                ELSE 0
            END [Other]   
        ,NumAtCard
        ,U_TransactionID
        ,U_SalesSource
        ,Name
        ,LineNum
        ,ItemCode
        ,ItemName
        ,CstGrpCode
        ,U_WebName
        ,U_SupplierCatNum
        ,CatCode
        ,CatName
        ,GroupCode
        ,GroupName
        ,DeptCode
        ,DeptName
        ,MfcCode
        ,Manufacturer
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        ,DocTotal
        --,MarginPCT

        From Invoice    
        )
,Invoice2 as (      
    SELECT
        --DocEntry
         --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
          CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End SalesChnl   
          ,Case 
            When iVend = 1 OR DBS = 1 Then StoreName
            When Web = 1 Then Name --'Internet'
            When Other = 1 then 'Other' 
         End StoreName
        ,iVend
        ,DBS
        ,Web
        ,Other  
        --,NumAtCard
        --,U_TransactionID
        ,U_SalesSource
        ,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,MarginPCT
        --,DocTotal         
FROM Invoice1   

--Where GrossBuyPr = 0

Group By
        --DocEntry
        --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
        CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End    
        ,Case 
            When iVend = 1 OR DBS = 1 Then StoreName
            When Web = 1 Then Name --'Internet'
            When Other = 1 then 'Other'
         End
        ,iVend
        ,DBS
        ,Web
        ,Other  
        --,NumAtCard
        --,U_TransactionID
        ,U_SalesSource
        ,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,MarginPCT
        --,DocTotal   
        )
Select *
 from Invoice2

唯一的区别是这个case表达式,我尝试使用@salessource表中的Name列而不是字符串Internet。

,Case 
When iVend = 1 OR DBS = 1 Then StoreName
When Web = 1 Then Name --'Internet'
When Other = 1 then 'Other' 
 End StoreName

我尝试强制整理,但没有效果。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

取出列并在不抛出错误的状态下进入查询,然后开始逐个添加列,并在其中引发与其相关的其他列的错误检查,并在查询中添加类似的内容WHERE Clause

WHERE Table1.Collation1Col COLLATE DATABASE_DEFAULT = Table2.Collation2Col COLLATE DATABASE_DEFAULT

进一步调查检查表中Collat​​ion与其他列不同的列。使用

SELECT name, collation_name
FROM sys.columns
WHERE OBJECT_ID IN (SELECT OBJECT_ID
FROM sys.objects
WHERE type = 'U'
AND name = 'table_Name')

它将缩小您对罪犯的搜索范围。

答案 1 :(得分:0)

因此,最终的解决方案是创建一个真正的#temp表来存储具有排序规则问题的两个表中的数据,然后将该表连接到主查询的CTE中。

最终代码如下:

Declare @StartDate Date = '09/01/2013';
Declare @EndDate Date = Getdate();

Create Table #StoreTable (
SalesChnl Nvarchar(20),
StoreID Nvarchar(5),
StoreName Nvarchar(50));

insert into #StoreTable
SELECT 
'Web'
,[Code] 
,[Name]
FROM [@SALESSOURCE] 

insert into #StoreTable
Select   
'Retail'
,SiteId 
,Description
from CXSRetail.dbo.RtlStore;

With Invoice as (
        SELECT     
         a.DocEntry
        ,a.DocDate
        ,a.CardCode
        ,a.CardName
        ,a.U_CXS_FMST
        ,a.U_CXS_FRST
        ,a.U_DBS1StoreID
        ,CASE
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 3 then 2
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 4 then 3
            when a.DocDate >= '08/01/2011' then isnull(U_CXS_FMST,U_DBS1StoreID)
        end as CompleteStores
        ,CASE a.U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(a.U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(a.U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE a.CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
        ,a.NumAtCard
        ,a.U_TransactionID
        ,a.U_SalesSource
        ,b.LineNum
        ,b.ItemCode
        ,c.ItemName
        ,c.CstGrpCode
        ,c.U_WebName
        ,c.U_SupplierCatNum
        ,c.CatCode
        ,c.CatName
        ,c.GroupCode
        ,c.GroupName
        ,c.DeptCode
        ,c.DeptName
        ,c.MfcCode
        ,c.Manufacturer
        ,Cast(b.Quantity as INT) Quantity
        ,b.Price
        ,b.PriceBefDi
        ,b.LineTotal
        ,b.GrossBuyPr
        ,a.DocTotal
        ,((Cast(b.Quantity as INT)* b.Price)-(Cast(b.Quantity as INT)*b.GrossBuyPr))/(Cast(b.Quantity as INT)*b.GrossBuyPr)*100 as MarginPCT

        FROM         
        MonkeySports.dbo.INV1 AS b 
        INNER JOIN 
        MonkeySports.dbo.OINV AS a ON a.DocEntry = b.DocEntry
        Inner Join
        dbo.MS_OITM_Categories as c ON b.ItemCode = c.ItemCode
Where 
GrossBuyPr > 0.01
and
a.DocDate between @StartDate and @EndDate
) 
,Invoice1 as (
        Select 
         DocEntry
        ,DocDate
        ,CardCode
        ,CardName
        ,U_CXS_FMST
        ,U_CXS_FRST
        ,U_DBS1StoreID
        ,CompleteStores
        ,CASE U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
                    ,CASE
                WHEN iVend = 0 AND DBS = 0 AND Web = 0
                THEN 1
                ELSE 0
            END [Other]   
        ,NumAtCard
        ,U_TransactionID
        ,U_SalesSource
        ,LineNum
        ,ItemCode
        ,ItemName
        ,CstGrpCode
        ,U_WebName
        ,U_SupplierCatNum
        ,CatCode
        ,CatName
        ,GroupCode
        ,GroupName
        ,DeptCode
        ,DeptName
        ,MfcCode
        ,Manufacturer
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        ,DocTotal
        ,MarginPCT

        From Invoice    
        )
,Invoice2 as (      
    SELECT
        DocEntry
         --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
          ,CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End SalesChnl   
        ,CASE 
             When iVend = 1 OR DBS = 1 then CompleteStores
             When Web = 1 OR Other = 1 then U_SalesSource
         End as StoreID  
         ,#StoreTable.StoreName    
        --,iVend
        --,DBS
        --,Web
        --,Other    
        --,NumAtCard
        --,U_TransactionID
        --,U_SalesSource
        --,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,DocTotal         
        ,MarginPCT
FROM Invoice1 
inner join
#StoreTable on
CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Web'
          End  = #StoreTable.SalesChnl
AND           

CASE 
             When iVend = 1 OR DBS = 1 then CompleteStores
             When Web = 1 OR Other = 1 then U_SalesSource
         End = #StoreTable.StoreID

Group By
        DocEntry
        --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
        ,CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End    
         ,CASE 
             When iVend = 1 OR DBS = 1 then CompleteStores
             When Web = 1 OR Other = 1 then U_SalesSource
         End   
         ,#StoreTable.StoreName    
        --,iVend
        --,DBS
        --,Web
        --,Other    
        --,NumAtCard
        --,U_TransactionID
        --,U_SalesSource
        --,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
      --,DocTotal   
        ,MarginPCT
        )
,CreditMemo as (
        SELECT     
         a.DocEntry
        ,a.DocDate
        ,a.CardCode
        ,a.CardName
        ,a.U_CXS_FMST
        ,a.U_CXS_FRST
        ,a.U_DBS1StoreID
        ,CASE
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 3 then 2
            when a.DocDate < '08/01/2011' and U_DBS1StoreID = 4 then 3
            when a.DocDate >= '08/01/2011' then isnull(U_CXS_FMST,U_DBS1StoreID)
        end as CompleteStores
        ,CASE a.U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(a.U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(a.U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE a.CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
        ,a.NumAtCard
        ,a.U_TransactionID
        ,a.U_SalesSource
        ,b.LineNum
        ,b.ItemCode
        ,c.ItemName
        ,c.CstGrpCode
        ,c.U_WebName
        ,c.U_SupplierCatNum
        ,c.CatCode
        ,c.CatName
        ,c.GroupCode
        ,c.GroupName
        ,c.DeptCode
        ,c.DeptName
        ,c.MfcCode
        ,c.Manufacturer
        ,(Cast(b.Quantity as INT)*-1) Quantity
        ,b.Price
        ,b.PriceBefDi
        ,b.LineTotal
        ,b.GrossBuyPr
        ,a.DocTotal
        ,((Cast(b.Quantity as INT)* b.Price)-(Cast(b.Quantity as INT)*b.GrossBuyPr))/(Cast(b.Quantity as INT)*b.GrossBuyPr)*100 as MarginPCT

        FROM         
        MonkeySports.dbo.RIN1 AS b 
        INNER JOIN 
        MonkeySports.dbo.ORIN AS a ON a.DocEntry = b.DocEntry
        Inner Join
        dbo.MS_OITM_Categories as c ON b.ItemCode = c.ItemCode
Where 
GrossBuyPr > 0.01
and
a.DocDate between @StartDate and @EndDate       
) 
,CreditMemo1 as (
        Select 
         DocEntry
        ,DocDate
        ,CardCode
        ,CardName
        ,U_CXS_FMST
        ,U_CXS_FRST
        ,U_DBS1StoreID
        ,CompleteStores
        ,CASE U_CXS_FRST
                    WHEN N'Y' THEN 1
                    WHEN N'N' THEN 0
                    ELSE 0
              END [iVend]
        ,     CASE 
                    WHEN ISNULL(U_DBS1StoreID,0)=0 THEN 0
                    WHEN ISNULL(U_DBS1StoreID,0)<>0 THEN 1
              END   [DBS]
        ,     CASE CardCode
                    WHEN N'C100' THEN 1
                    ELSE 0
              END [Web]
                    ,CASE
                WHEN iVend = 0 AND DBS = 0 AND Web = 0
                THEN 1
                ELSE 0
            END [Other]   
        ,NumAtCard
        ,U_TransactionID
        ,U_SalesSource
        ,LineNum
        ,ItemCode
        ,ItemName
        ,CstGrpCode
        ,U_WebName
        ,U_SupplierCatNum
        ,CatCode
        ,CatName
        ,GroupCode
        ,GroupName
        ,DeptCode
        ,DeptName
        ,MfcCode
        ,Manufacturer
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        ,DocTotal
        ,MarginPCT

        From CreditMemo 
        )
,CreditMemo2 as (       
    SELECT
        DocEntry
         --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
          ,CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End SalesChnl   
         ,CASE 
             When iVend = 1 OR DBS = 1 then CompleteStores
             When Web = 1 OR Other = 1 then U_SalesSource
         End as StoreID  
         ,#StoreTable.StoreName  
        --,iVend
        --,DBS
        --,Web
        --,Other    
        --,NumAtCard
        --,U_TransactionID
        --,U_SalesSource
        --,Name
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,DocTotal         
        ,MarginPCT
FROM CreditMemo1
inner join
#StoreTable on
CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Web'
          End  = #StoreTable.SalesChnl
AND           
CASE 
             When iVend = 1 OR DBS = 1 then CompleteStores
             When Web = 1 OR Other = 1 then U_SalesSource
         End = #StoreTable.StoreID
Group By
        DocEntry
        --DocDate
        --,CardCode
        --,CardName
        --,U_CXS_FMST
        --,U_CXS_FRST
        --,U_DBS1StoreID
        --,CompleteStores
        ,CASE
            When iVend = 1 or DBS = 1 then 'Retail'
            When Web = 1 then 'Web'
            When Other = 1 then 'Other'
          End    
        ,CASE 
             When iVend = 1 OR DBS = 1 then CompleteStores
             When Web = 1 OR Other = 1 then U_SalesSource
         End    
         ,#StoreTable.StoreName  
        --,iVend
        --,DBS
        --,Web
        --,Other    
        --,NumAtCard
        --,U_TransactionID
        --,Name
        --,U_SalesSource
        --,LineNum
        --,CstGrpCode
        --,U_WebName
        --,U_SupplierCatNum
        --,CatCode
        ,CatName
        --,GroupCode
        ,GroupName
        --,DeptCode
        ,DeptName
        --,MfcCode
        ,Manufacturer
        ,ItemCode
        ,ItemName
        ,Quantity
        ,Price
        ,PriceBefDi
        ,LineTotal
        ,GrossBuyPr
        --,DocTotal   
        ,MarginPCT
        )

Select *
from 
Invoice2  
Union 

Select *
from 
CreditMemo2  
Order by 
MarginPCT Desc
,SalesChnl
,StoreName
,CatName
,DeptName

DROP TABLE #StoreTable

感谢大家的帮助。