我找不到任何问题/答案,可以帮助我接近我的目标。我有以下表格check code on SQL Fiddle。如何按行和列进行分组?
SITENAME RTYPE SEASON CTRSTAT CTRTYPE UNITS STARTDATE WKTYPE INVSTAT
site1 T2B P null null 92 null FRSA_P Unsold
site1 T2B Pre null null 36 null FRSA_P Unsold
site1 T2B PRI null null 173 null FRSA_P Unsold
site1 T2B SPE null null 56 null FRSA_P Unsold
site1 T2B P Complete FRSA 2 2013-01-01 FRSA_P Sold
site1 T2B Pre Complete FRSA 2 2013-01-01 FRSA_P Sold
site1 T2B PRI Complete FRSA 2 2013-01-01 FRSA_P Sold
site1 T2B P Complete FRSA 1 2013-03-05 FRSA_P Sold
site1 T2B P Complete FRSA 3 2014-01-01 FRSA_P Sold
site1 T2B Pre Complete FRSA 4 2014-01-01 FRSA_P Sold
site1 T3B P null null 69 null FRSA_P Unsold
site1 T3B Pre null null 26 null FRSA_P Unsold
site1 T3B PRI null null 125 null FRSA_P Unsold
site1 T3B SPE null null 40 null FRSA_P Unsold
site1 T3B Pre Complete FRSA 2 2013-01-01 FRSA_P Sold
site1 T3B P Complete FRSA 1 2014-01-01 FRSA_P Sold
site1 T3B Pre Complete FRSA 2 2014-01-01 FRSA_P Sold
然后以某种方式得到如下图所示的报告。如果InvStatus未售出,报告应该返回未售出,否则为CTRSTAT。
请不要注意总计和总计,使用其他数据的图像是从Excel。只是为了获得所需结果的样本。
编辑:日期列对应于一整年,所以例如2013-03-05
的日期列属于01/01/2013
列。在无效日期的情况下,他们将去到显示的最后一年,在这种情况下01/01/2014
,但可以是2015年,无论上一次显示哪个周期。
我已经尝试了几种不同的方法,使用GROUP BY
连同各种类型的GROUPING
和SETS
,但都没有工作。 CUBE
和ROLLUP
没有用,或者至少我没有设法得到正确的结果。也许只是不可能,至少不是一个简单的方法。
下面是我尝试过的许多查询之一的样本,试图扭曲它以获得类似报告的内容,但仍然没有任何结果。
SELECT
sitename, rtype, season, ctrstat, ctrtype, SUM(units)
,startdate, invstat
FROM tt
GROUP BY
GROUPING SETS ((sitename,InvStat,ctrstat)
,(RType,ctrtype,season,startdate)
,()
)
编辑:也许应该更好地使用SSRS完成这个任务?
有趣的问题。这并不容易,但这是可能的。在开始分组之前,您必须首先进行一些旋转以提取所需的列。如果我在接下来的几个小时内获得一些空闲时间,我会尝试给你一些疑问,但不能承诺。 – 2013-04-23 09:45:36
几个问题:您的startdate如何转换为哪些列数据所属? 2013年或2014年?特别为未售出的地方它是NULL? 2013-03-05在哪里?您能否根据您发布的确切数据提供预期结果? – 2013-04-23 09:55:22
谢谢@NenadZivkovic,检查新的编辑。在某些时候,我考虑过转向,但我甚至不知道如何解决这个问题。 – Yaroslav 2013-04-23 10:07:35