【发布时间】:2026-01-10 06:30:01
【问题描述】:
注意:这是this question 和this question 和this question 的后续[on,up]。
所有的回答都让我前进,但即使是最后一个,虽然它改善了问题,但并没有完全解决这个问题。
这个查询:
select monthlysales, MemberNo from ReportingMonthlySales
where unit = 'Abuelos' and CYear = 2017 and cmonth = 3
...返回一堆行,其中每月销售总额为 $364,121.69
但是,当我尝试将这些月销售额分成四类时,虽然它们的总和应该是相同的,但总和实际上是天文数字的“巨大”——以下代码返回了 23,924,211.30 的巨大膨胀值
2400 万美元几乎是实际总额 36.4 万美元的 70 倍。为什么会发生这种“疯狂”的通货膨胀?
这是花哨的裤子,但显然是被骗的代码:
declare @Unit varchar(30);
declare @Year int = 2017;
declare @Month int = 3;
declare @paramdate datetime;
set @paramdate = convert(datetime,convert(char(4),@Year)
+right('0'+convert(varchar(2),@month),2)
+'01')
IF OBJECT_ID('tempdb.dbo.#Units', 'U') IS NOT NULL
DROP TABLE #Units
select distinct unit
into #Units
from ReportingMonthlySales;
select
u.Unit
, New = sum(case when ccl.Subcategory = 'New' then rms.MonthlySales else 0 end)
, Assumed = sum(case when ccl.Subcategory = 'Assumed' then rms.MonthlySales else 0 end)
, Existing = sum(case when ccl.Subcategory = 'Existing' then rms.MonthlySales else 0 end)
, Organic = sum(case when ccl.Subcategory = 'Organic' then rms.MonthlySales else 0 end)
from #Units u
left join CustomerCategoryLog ccl
on u.Unit = ccl.Unit
and @paramdate >= ccl.begindate and
(@paramdate <= ccl.enddate OR ccl.enddate is null)
left join ReportingMonthlySales rms
on u.Unit = rms.Unit
and rms.cyear = @year
and rms.cmonth = @month
group by u.unit;
The two tables queried are:
CustomerCategoryLog
-------------------
MemberNo (VarChar)
Unit (VarChar)
Custno (VarChar)
Category (VarChar)
Subcategory (VarChar)
BeginDate (DateTime)
EndDate (DateTime)
ChangedBy (VarChar)
ChangedOn (DateTime)
ReportingMonthlySales
---------------------
AutoID (Int)
Unit (VarChar)
MemberNo (VarChar)
NumUnits (Int)
MonthlySales (Money)
CYear (Int)
Cmonth (Int)
CreateDate (DateTime)
fancy-pants sql 中是否有问题,或者...?!?
【问题讨论】:
-
我敢打赌,如果您删除查询的总和部分并仅添加其他几列以查看实际结果集(例如 Id 列),您会注意到查询的结果集是重复行,这意味着您的联接需要更多微调。
-
同意@Sparrow,尤其是因为 CustomerCategoryLog 似乎是一个日志表,并且可能导致一对多连接。
-
也运行这个,让我们知道返回了多少行 -
select * from CustomerCategoryLog where unit = 'Abuelos' -
查看 CustomerCategoryLog 和 ReportingMonthlySales 之间的连接。按子类别划分的细分是 CustomerCategoryLog 的一部分,但除非 Unit 在它们之间是唯一的,否则 CCL 表中的单行与 RMS 表中的单行之间没有实际关联。很可能您需要将客户加入到他购买的汽车中,然后将其加入到 ReportingMonthlySales 表中才能正确分解。
标签: sql sql-server tsql