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 からのものです。必要な結果のサンプルを取得するだけです。

編集:日付の列は 1 年に対応するため、たとえば、列に2013-03-05属するものがあり01/01/2013ます。日付が null の場合は、最後に表示された年に移動しますが、この場合01/01/2014は 2015 年になる可能性があります。

さまざまなタイプとGROUP BY一緒に使用して、いくつかの異なるアプローチを試しましたが、どれもうまくいきませんでした。役に立たないか、少なくとも正しい結果を得ることができませんでした。少なくとも簡単な方法では、おそらく不可能です。GROUPINGSETSCUBEROLLUP

これは、私が試した多くのクエリの 1 つのサンプルです。レポートのようなものを取得するためにひねりを加えようとしましたが、まだ近いものはありません。

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

編集で言及したように、これを行うのはSSRSだと思います。マトリックスを使用して、探しているレポートを簡単に作成できます。SQL フィドルで指定されたデータを使用すると、以下に示すようなものをすばやく取得できます。

編集:合計値を追加 ここに画像の説明を入力

ここに画像の説明を入力

于 2013-04-23T11:38:39.740 に答える
1

SSRS の方がおそらくより適切なオプションですが、SQL クエリを使用してそれを行う方法を次に示します。最終的には、この 2 つを組み合わせることが最善の解決策になる可能性があります。

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 の値が大きく異なるとは思いませんし、すべての可能な値を前もって知っていると思います。年はもう少し問題がありますが、それでもそれほど多くはないと思います. 「THIS Year, LAST Year, NEXT Year」を使用して、将来に適応できるようにすることもできます。

クエリの 2 番目の部分は、単純なグループ化セットを使用してグループ化するだけです。ROLLUP はこれと同じです。

于 2013-04-23T12:15:11.957 に答える