2

我找不到任何可以帮助我接近目标的问题/答案。我在 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 未售出,则报告应返回Unsold,否则返回 CTRSTAT。

按列和行分组后的结果

请不要关注总数和总计,图像来自使用其他数据的excel。只是为了获得所需结果的样本。

编辑:日期列对应于一整年,因此例如2013-03-05属于该列的日期01/01/2013列。如果日期为空,则它们将转到显示的最后一年,在这种情况下01/01/2014,但可能是 2015 年或最后显示的任何时期。

我尝试了几种不同的方法,与各种类型GROUP BY一起使用,但都没有奏效。并且没有用,或者至少我没有设法得到正确的结果。也许只是不可能,至少不是一个简单的方法。GROUPINGSETSCUBEROLLUP

这是我尝试过的众多查询之一的示例,试图扭曲它以获得类似报告的内容,但仍然没有接近。

SELECT
       sitename, rtype, season, ctrstat, ctrtype, SUM(units)
      ,startdate, invstat
  FROM tt
 GROUP BY
GROUPING SETS ((sitename,InvStat,ctrstat)
               ,(RType,ctrtype,season,startdate)
               ,()
              )

编辑:也许应该更好地使用 SSRS 来完成这项任务?

4

2 回答 2

2

正如您在编辑中提到的那样,我认为这样做 i SSRS 是要走的路。您可以使用矩阵轻松创建您要查找的报告。通过使用 SQL fiddle 中给出的数据,您可以快速获得如下所示的内容。

编辑:添加总值 在此处输入图像描述

在此处输入图像描述

于 2013-04-23T11:38:39.740 回答
1

虽然 SSRS 可能是一个更好的选择,但这里是如何使用 SQL 查询来完成的。最后,将两者结合起来可能是最好的解决方案。

WITH CTE_Pivot AS 
(
    SELECT
         sitename
        ,rtype
        ,season
        ,CASE WHEN invstat = 'Sold' AND ctrStat = 'Complete' AND YEAR(startdate)=2013 THEN units ELSE 0 END AS Complete2013
        ,CASE WHEN invstat = 'Sold' AND ctrStat = 'Complete' AND (YEAR(startdate)=2014 OR startdate IS NULL) THEN units ELSE 0 END AS Complete2014
        ,CASE WHEN invstat = 'Unsold' AND YEAR(startdate)=2013 THEN units ELSE 0 END AS Unsold2013
        ,CASE WHEN invstat = 'Unsold' AND (YEAR(startdate)=2014 OR startdate IS NULL) THEN units ELSE 0 END AS Unsold2014
        ,units AS Total
    FROM tt 
)
SELECT sitename,rtype,season
    ,SUM(Complete2013) AS Complete2013
    ,SUM(Complete2014) AS Complete2014
    ,SUM(Unsold2013) AS Unsold2013
    ,SUM(Unsold2014) AS Unsold2014
    ,SUM(Total) AS GrandTotal
FROM CTE_Pivot
GROUP BY GROUPING SETS ((sitename,rtype,season),(sitename,rtype),sitename)

SQLFiddle 演示

第一部分是旋转你的列。这是一种相当简单的方法,不使用PIVOT函数,而是为语句中的每一列声明条件CASE。它假设您有固定数量的可能值(和列),这些值可能并不完美,但是创建动态列需要动态 SQL,这会使该查询达到全新的复杂程度。

毕竟在这种情况下,我真的认为 CTRSTAT 的值不会有太大的不同,而且我猜你预先知道所有可能的值。年份有点问题,但我想仍然没有那么多。您也许可以选择“今年、去年、下一年”,使其更适应未来。

查询的第二部分只是使用简单的分组集进行分组。ROLLUP 将与此相同。

于 2013-04-23T12:15:11.957 回答