3

どちらの解決策が良いのだろうか。ビューでいくつかの変数を宣言する必要があります。これらの変数は、T-SQLの日付関数(DATEADD、DATEPART、GETDATE()など)を使用して計算されます。

いくつかの調査の後、私はこれを書きました:

WITH DatePeriods(ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate) AS
(
    SELECT  "...date functions..." AS ThisWeek
            "...date functions..." AS LastWeek
            "...date functions..." AS MonthToDate
            "...date functions..." AS QuarterToDate
            "...date functions..." AS YearToDate
)
SELECT Desciption,Value
FROM DatePeriods
UNPIVOT
(
    Value FOR Desciption IN (ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate)
) AS Source

そして、私は「cte」と「unpivot」を持っているので、それはクールに見えます。他の日付変数を追加したい場合は、CTEの選択にのみ挿入する必要があります。

そして、もう1つの解決策は、通常の「ユニオン」を使用することです。

SELECT  'ThisWeek',"...date functions..." AS ThisWeek
UNION
SELECT  'LastWeek',"...date functions..." AS LastWeek
UNION
SELECT  'MonthToDate',"...date functions..." AS MonthToDate
UNION
SELECT  'QuarterToDate',"...date functions..." AS QuarterToDate
UNION
SELECT  'YearToDate',"...date functions..." AS YearToDate

新しい日付変数は新しい結合を意味するので、あまり良くないと思いますが、結局のところ、いくつかの変数間の結合のみです。

この場合、どのテクニックが良い習慣であるか、あるいは他の解決策を提供するかを誰かに教えてもらえますか?

前もって感謝します。

編集:

これは私が望む出力です:

Desciption      Value
ThisWeek        2012-08-05 08:55:23.013
LastWeek        2012-07-29 08:55:23.013
MonthToDate     2012-07-08 08:55:23.013
QuarterToDate   2012-05-08 08:55:23.013
YearToDate      2011-08-08 08:55:23.013
4

1 に答える 1

5

クエリ プランを見ると、unionバージョンよりもはるかにコストが高いことがわかりますunpivot。しかし、union all代わりに に変更すると、 よりも優れたものになりますunpivot

SQL Server 2008 以降を使用している場合は、values代わりに使用できます。実行計画によると、コストは と同じunion allです。

値のバージョン:

select Description, Value
from (values ('ThisWeek',      getdate()+1),
             ('LastWeek',      getdate()+2),
             ('MonthToDate',   getdate()+3),
             ('QuarterToDate', getdate()+4),
             ('YearToDate',    getdate()+5)
     ) as T(Description, Value)

すべてのバージョンを統合:

SELECT  'ThisWeek' AS Description, getdate()+1 AS Value
UNION ALL
SELECT  'LastWeek', getdate()+2
UNION ALL
SELECT  'MonthToDate', getdate()+3 
UNION ALL
SELECT  'QuarterToDate', getdate()+4 
UNION ALL
SELECT  'YearToDate', getdate()+5

の理由unionは、値に関係なくすべての行を組み込むunion all結果セットから重複を削除しようとするためです。union all

于 2012-08-08T14:23:01.577 に答える