我很难找出为什么此查询在分组中产生排序规则错误。 我把它缩小到一个特定的案例陈述。它的工作原理是一种方式(结果是一个字符串),但是当我尝试从另一个表中替换一个字段时(它在你自己的头脑中显示得很好),它会引发排序错误。为什么此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
我试过强制排序,并没有任何效果。
任何援助不胜感激。
首先删除尽可能多的东西,而不会丢失错误。 – Laurence