2013-10-21 24 views
-2

我很难找出为什么此查询在分组中产生排序规则错误。 我把它缩小到一个特定的案例陈述。它的工作原理是一种方式(结果是一个字符串),但是当我尝试从另一个表中替换一个字段时(它在你自己的头脑中显示得很好),它会引发排序错误。为什么此SQL服务器查询产生排序规则冲突

这是可以正常工作的代码。

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 

唯一的区别是这种情况下表达,我试图从@salessource表而不是字符串互联网使用的名称列。

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

我试过强制排序,并没有任何效果。

任何援助不胜感激。

+3

首先删除尽可能多的东西,而不会丢失错误。 – Laurence

回答

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 

感谢大家的帮助。

0

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

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

为表进一步调查检查列中的排序规则是从其他列不同。使用

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

它会缩小您的搜索的罪魁祸首。

+0

所以我缩小了这个问题。看起来在排序冲突的两个表中,我使用INT作为我连接的字段,另一个表使用nvarchar作为链接字段。 当我试图将它们转换为相同的(无论是int或Nvarchar)我得到的错误不能使用INT整理。 GRRRRR 所以我想出了使用Table变量并用两个冲突表中的值填充它的想法。到现在为止还挺好。 但是,我似乎无法得到CTE认可的表变量。 我该怎么做? – CraigBob

+0

加入表格只需将FK列转换为PK列数据类型类似... ON Table1.ID = CAST(Table2.Column AS INT) –

+0

我试过了,它给了我错误不能整理(INT) 而且我不能在CTE中使用@table变量。我不得不创建一个真正的临时表。所以现在我需要弄清楚如何将#temp表加入CTE。 #temp表有两部分的关键,因为storeID可以重复(它们来自不同的源系统,我很难过。 – CraigBob