我很难弄清楚为什么这个查询会在分组中产生排序规则错误。我已经把它缩小到一个特定的案例陈述。它以一种方式工作(结果作为字符串)但是当我尝试从另一个表中替换一个字段时(它在你自己的脑海中显示得很好)它会引发排序错误。
这是运行良好的代码。
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
我试过强制整理,但没有效果。
非常感谢任何帮助。