SELECT A.RebuildCompanyID,
SUM(A.TargetPurchasedAmount) AS TargetPurchasedAmount,
SUM(A.SalesPromotionFee) AS SalesPromotionFee
FROM (
SELECT
RebuildCompanyM.RebuildCompanyID,
GroupMemberM.MemberID,
CAST(
CASE RebuildCalculation.PurchasedAmountEntrySpec
WHEN 0 THEN
ISNULL((RebuildClaimD.DiscountPurchasedAmount1 +
RebuildClaimD.DiscountPurchasedAmount2 +
RebuildClaimD.PurchasedAmount) - RebuildClaimD.DiscountAmount,0)
ELSE
ISNULL(RebuildSalesPromotionD.TargetPurchasedAmount,0)
END AS FLOAT) AS TargetPurchasedAmount,
CAST(
CASE RebuildCalculation.PurchasedAmountEntrySpec
WHEN 0 THEN
CASE (
SELECT COUNT(*) FROM Config
WHERE PurchaseForRefund <= RebuildClaimT.DiscountPurchasedAmount1 +
RebuildClaimT.DiscountPurchasedAmount2 +
RebuildClaimT.PurchasedAmount)
WHEN 0 THEN 0
ELSE (
SELECT ROUND(((RebuildClaimD.DiscountPurchasedAmount1 +
RebuildClaimD.DiscountPurchasedAmount2 +
RebuildClaimD.PurchasedAmount) -
RebuildClaimD.DiscountAmount) * RefundRate,0)
FROM Config
WHERE PurchaseForRefund <= RebuildClaimT.DiscountPurchasedAmount1 +
RebuildClaimT.DiscountPurchasedAmount2 +
RebuildClaimT.PurchasedAmount)
END
ELSE
ISNULL(RebuildSalesPromotionD.SalesPromotionFee,0)
END AS FLOAT) AS SalesPromotionFee
FROM RebuildCompanyM,GroupMemberM
LEFT JOIN RebuildSalesPromotionD ON (RebuildSalesPromotionD.GeneratingMonth = '2008/01/01'
AND RebuildSalesPromotionD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildSalesPromotionD.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildClaimD ON (RebuildClaimD.GeneratingMonth = '2008/01/01'
AND RebuildClaimD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildClaimD.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildClaimT ON (RebuildClaimT.GeneratingMonth = '2008/01/01'
AND RebuildClaimT.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildCalculation ON (RebuildCalculation.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildCalculation.MemberID = GroupMemberM.MemberID)
WHERE (RebuildCompanyM.DeleteFlag = 0
AND GroupMemberM.DeleteFlag = 0
AND GroupMemberM.IsInputRebuild = 1)) A
GROUP BY A.RebuildCompanyID
ORDER BY A.RebuildCompanyID ASC
SELECT A.RebuildCompanyID,
SUM(A.TargetPurchasedAmount) AS TargetPurchasedAmount,
SUM(A.SalesPromotionFee) AS SalesPromotionFee
FROM (
SELECT
t1.RebuildCompanyID,
t2.MemberID,
CAST(
CASE t6.PurchasedAmountEntrySpec
WHEN 0 THEN
ISNULL((t4.DiscountPurchasedAmount1 +
t4.DiscountPurchasedAmount2 +
t4.PurchasedAmount) - t4.DiscountAmount,0)
ELSE
ISNULL(t3.TargetPurchasedAmount,0)
END AS FLOAT) AS TargetPurchasedAmount,
CAST(
CASE t6.PurchasedAmountEntrySpec
WHEN 0 THEN
CASE (
SELECT COUNT(*) FROM Config
WHERE PurchaseForRefund <= t5.DiscountPurchasedAmount1 +
t5.DiscountPurchasedAmount2 +
t5.PurchasedAmount)
WHEN 0 THEN 0
ELSE (
SELECT ROUND(((t4.DiscountPurchasedAmount1 +
t4.DiscountPurchasedAmount2 +
t4.PurchasedAmount) -
t4.DiscountAmount) * RefundRate,0)
FROM Config
WHERE PurchaseForRefund <= t5.DiscountPurchasedAmount1 +
t5.DiscountPurchasedAmount2 +
t5.PurchasedAmount)
END
ELSE
ISNULL(t3.SalesPromotionFee,0)
END AS FLOAT) AS SalesPromotionFee
FROM RebuildCompanyM as t1,GroupMemberM as t2
LEFT JOIN RebuildSalesPromotionD as t3 ON (t3.GeneratingMonth = '2008/01/01'
AND t3.RebuildCompanyID = t1.RebuildCompanyID
AND t3.MemberID = t2.MemberID)
LEFT JOIN RebuildClaimD as t4 ON (t4.GeneratingMonth = '2008/01/01'
AND t4.RebuildCompanyID = t1.RebuildCompanyID
AND t4.MemberID = t2.MemberID)
LEFT JOIN RebuildClaimT as t5 ON (t5.GeneratingMonth = '2008/01/01'
AND t5.MemberID = t2.MemberID)
LEFT JOIN RebuildCalculation as t6 ON (t6.RebuildCompanyID = t1.RebuildCompanyID
AND t6.MemberID = t2.MemberID)
WHERE (t1.DeleteFlag = 0
AND t2.DeleteFlag = 0
AND t2.IsInputRebuild = 1)) A
GROUP BY A.RebuildCompanyID
ORDER BY A.RebuildCompanyID ASC
FROM RebuildCompanyM,GroupMemberM
LEFT JOIN RebuildSalesPromotionD ON (RebuildSalesPromotionD.GeneratingMonth = '2008/01/01'
AND RebuildSalesPromotionD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildSalesPromotionD.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildClaimD ON (RebuildClaimD.GeneratingMonth = '2008/01/01'
AND RebuildClaimD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildClaimD.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildClaimT ON (RebuildClaimT.GeneratingMonth = '2008/01/01'
AND RebuildClaimT.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildCalculation ON (RebuildCalculation.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildCalculation.MemberID = GroupMemberM.MemberID)
WHERE (RebuildCompanyM.DeleteFlag = 0
AND GroupMemberM.DeleteFlag = 0
AND GroupMemberM.IsInputRebuild = 1)) A
-----------------------------------------
--改为
FROM RebuildCompanyM inner join GroupMemberM on (RebuildSalesPromotionD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID)
LEFT JOIN RebuildSalesPromotionD ON (RebuildSalesPromotionD.GeneratingMonth = '2008/01/01'
AND RebuildSalesPromotionD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildSalesPromotionD.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildClaimD ON (RebuildClaimD.GeneratingMonth = '2008/01/01'
AND RebuildClaimD.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildClaimD.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildClaimT ON (RebuildClaimT.GeneratingMonth = '2008/01/01'
AND RebuildClaimT.MemberID = GroupMemberM.MemberID)
LEFT JOIN RebuildCalculation ON (RebuildCalculation.RebuildCompanyID = RebuildCompanyM.RebuildCompanyID
AND RebuildCalculation.MemberID = GroupMemberM.MemberID)
WHERE (RebuildCompanyM.DeleteFlag = 0
AND GroupMemberM.DeleteFlag = 0
AND GroupMemberM.IsInputRebuild = 1)) A
表RebuildCompanyM中包含RebuildCompanyID字段;
表GroupMemberM中包含MemberID字段;
表RebuildSalesPromotionD中包含RebuildCompanyID和MemberID字段;
表RebuildClaimD中包含RebuildCompanyID和MemberID字段;
表RebuildClaimT中包含MemberID字段;
表RebuildCalculation中包含RebuildCompanyID和MemberID字段;
所有的表中都包含GeneratingMonth字段RebuildCompanyID、MemberID、GeneratingMonth都是表中的主键,因此具有唯一性。我没用过笛卡尔,不过从上面分析,应该不需要用笛卡尔积。逻辑是以日期(GeneratingMonth字段)为查询条件,计算出符合条件的金额合计数。
这SQL,看着就头晕.但是看起来逻辑又不是很复杂.
比这复杂多的语句有的是.叫别人看别人很难看得出耿,所以还得你自己调试.
SELECT A.RebuildCompanyID,
SUM(A.TargetPurchasedAmount) AS TargetPurchasedAmount,
SUM(A.SalesPromotionFee) AS SalesPromotionFee
FROM (
SELECT
t1.RebuildCompanyID,
t2.MemberID,
CAST(
CASE t6.PurchasedAmountEntrySpec
WHEN 0 THEN
ISNULL((t4.DiscountPurchasedAmount1 +
t4.DiscountPurchasedAmount2 +
t4.PurchasedAmount) - t4.DiscountAmount,0)
ELSE
ISNULL(t3.TargetPurchasedAmount,0)
END AS FLOAT) AS TargetPurchasedAmount,
CAST(
CASE t6.PurchasedAmountEntrySpec
WHEN 0 THEN
CASE (
SELECT COUNT(*) FROM Config
WHERE PurchaseForRefund <= t5.DiscountPurchasedAmount1 +
t5.DiscountPurchasedAmount2 +
t5.PurchasedAmount)
WHEN 0 THEN 0
ELSE (
SELECT ROUND(((t4.DiscountPurchasedAmount1 +
t4.DiscountPurchasedAmount2 +
t4.PurchasedAmount) -
t4.DiscountAmount) * RefundRate,0)
FROM Config
WHERE PurchaseForRefund <= t5.DiscountPurchasedAmount1 +
t5.DiscountPurchasedAmount2 +
t5.PurchasedAmount)
END
ELSE
ISNULL(t3.SalesPromotionFee,0)
END AS FLOAT) AS SalesPromotionFee
FROM RebuildCompanyM as t1,GroupMemberM as t2
LEFT JOIN RebuildSalesPromotionD as t3 ON (t3.GeneratingMonth = '2008/01/01'
AND t3.RebuildCompanyID = t1.RebuildCompanyID
AND t3.MemberID = t2.MemberID)
LEFT JOIN RebuildClaimD as t4 ON (t4.GeneratingMonth = '2008/01/01'
AND t4.RebuildCompanyID = t1.RebuildCompanyID
AND t4.MemberID = t2.MemberID)
LEFT JOIN RebuildClaimT as t5 ON (t5.GeneratingMonth = '2008/01/01'
AND t5.MemberID = t2.MemberID)
LEFT JOIN RebuildCalculation as t6 ON (t6.RebuildCompanyID = t1.RebuildCompanyID
AND t6.MemberID = t2.MemberID)
WHERE (t1.DeleteFlag = 0
AND t2.DeleteFlag = 0
AND t2.IsInputRebuild = 1)) A
GROUP BY A.RebuildCompanyID
ORDER BY A.RebuildCompanyID ASC
........
drop table #tb1
drop table #tb2
.........