0

1週間のグーグル検索の後、私は自分の問題の解決策に近づいておらず、誰かが助けてくれることを望んでいます. 一生懸命探したのに回答されていたら、あらかじめお詫びします。

私たちが「高齢債務者」と呼んでいるものについてのレポートを作成しています。このレポートの一部では、昨年の合計、今年の合計、および列として 2 つのパーセンテージが必要です。もう 1 つの要件は、「今年」 (つまり、今日から 1 年前までさかのぼる日付) を 30 日延滞、60 日延滞、および 90 日以上延滞している勘定科目に分割することでした。次の列を持つ 1 つのデータセットにすべてのデータを返しました

(#) Accounts、Country、AccountType、OverdueAmount、OverdueTime (30、60、90 および昨年) および YearGroup (今年は TY、昨年は LY)

2 つの行グループ (Country および Account Type (Country のサブグループ)) と 2 つの列グループ (Total Overdue および Overdue time - 相互に関係なし...Overdue time は金額を 30、60、90 に分割します) を作成しました。日など 合計延滞は昨年と今年の数字を教えてくれます)

延滞合計は、次を使用してグループ内の 2 つの列に分割されます。

=format(iif(Fields!YearGroup.Value = "LY",Sum(Fields!OverdueAmount.Value), iif((Fields!YearGroup.Value = "TY"), Sum(Fields!OverdueAmount.Value), 0)), "C")

これはうまくいきます!私の問題は、クライアントが基本的に彼のためにパーセンテージを行うその横の列を望んでいることです-合計(今年-昨年)/昨年。だから基本的に私はこのレイアウトが欲しい

昨年、今年、パーセンテージ

グループに別の列を作成しようとしましたが、これは前の各列の隣に新しい列を挿入しただけなので、

昨年, コラム, 今年, コラム

次に、グループの横に列を作成し、「AccountType」行のスコープと iif ステートメントを使用して、昨年と今年を区別しようとしました

 (iif(Fields!YearGroup.Value = "TY", sum(overdueamount.value), 0) -iif(fields!YearGroup.Value = "LY", sum(overdueamount.value), 0)

基本的な違いを取得しようとすると、すべてを追加したいようです-例は次のとおりです

Last year = $200
This Year = $100

差額は 100 ドルのはずですが、RS によると 300 ドルです。

(上記のように iif ステートメントをネストするなど、何度も繰り返してみました)

YearGroup の値が何であれ、すべてを合計しているようです - これが RS がグループをレンダリングする方法だと感じています - 年の値の 1 つが 0 の場合 (昨年は 200 ドルの口座タイプがあり、今年は$0) なら、私がやりたいことも「できる」ように見えます。

SQL でこれを行うことを検討しましたが、複雑すぎて 1 つのデータ セットで返すことができないと思います (現在、すべてを 1 つの DS に入れるためにいくつかの狂った結合を行っています)。

グループ内で動的に作成された 2 つの列の違いに基づいて % 値を計算する方法はありますか? 必要に応じて詳細を教えてください...

4

3 に答える 3

1

次のように、 iif ロジックを Sum 関数内に移動する必要があると思います。

= sum( iif(Fields!YearGroup.Value = "TY", overdueamount.value 
, iif(fields!YearGroup.Value = "LY", 0 - overdueamount.value , 0) ) )

ところで、SSRS 2008+ は、ReportItems コレクションを通じてこの課題をエレガントに解決します...

于 2013-01-07T10:49:11.563 に答える
0

PARTITION を使用すると、SQL でこれを行うのは実際にはかなり簡単です。

SELECT DISTINCT
    CASE
        WHEN DatePart(Year, INV.DueByDate) = DatePart(Year, GetDate()) - 1 THEN 'Last Year'
        ELSE 'This Year'
    END YearGroup,
    SUM(INV.AmountDue) OVER(PARTITION BY    CASE
                                                    WHEN DatePart(Year, INV.DueByDate) = DatePart(Year, GetDate()) - 1 THEN 'Last Year'
                                                    ELSE 'This Year'
                                                END) TotalAmountOverDue,
    SUM(INV.AmountDue) OVER(PARTITION BY    CASE
                                                    WHEN DatePart(Year, INV.DueByDate) = DatePart(Year, GetDate()) - 1 THEN 'Last Year'
                                                    ELSE 'This Year'
                                                END) / Sum(INV.AmountDue) OVER() * 100 Percentage

FROM Invoice INV

WHERE INV.DueByDate >= '1/1/2012'
于 2013-03-24T02:40:32.793 に答える
0

まず、私を正しい道に導いてくれたマイクに感謝します! 分割の 2 番目の部分で変換を行う必要があることに気付きましたが、今では完全に機能しています!

乾杯、この質問とこれらの回答が他の誰かの助けになることを願っています - これと2週間戦った後、ついにそれを寝かせることができるかもしれません!

于 2013-01-08T05:43:24.723 に答える