3

以下のクエリでは、o.EventSetName、o.EventSetDisplay、o.EventSetDescription について - 結果の 3 つの列に重複する行がある場合は常に、最初の行のみが表示され、残りの重複する行は空白になります... ..

ここにSQLがあります:

 Select  distinct top 100000 o.EventSetName,       
                             o.EventSetDisplay,
                             o.EventSetDescription,
                             o.ChildSetName,
                             ROW_NUMBER() Over (Order By f.ChildSetName) RN,
                             f.DocumentDispSequence,
                             f.SectionDispSequence,
                             o.ObsSetDispSequence,
                             null                          
                      From   ##ObsSetLevel o,
                             ##Final f
                      Where  f.ChildSetName = o.EventSetName and 
                             o.EventSetName = @variableName
                      Order By RN asc, f.DocumentDispSequence asc, f.SectionDispSequence asc, o.ObsSetDispSequence asc

私はレポート ツールを持っていないので、今のところ、ストアド プロシージャ自体で多くのレポート ロジックを実行する必要があります...

したがって、代わりに:

val 1   val2    val3  val7
val 1   val2    val3  val8
val 1   val2    val3  val 10
val 1   val2    val3  x
val 1   val2    val3  y

行 2、3、4、および 5 の最初の 3 列が空白の結果を取得する必要があります。

4

1 に答える 1

5

既存のクエリを CTE でラップしROW_NUMBER OVER PARTITION BYて列を追加します。これにより、値のグループごとに RN が作成されます。外側のクエリでは、CASE を使用して GRP_RN = 1 の値を選択し、それ以外の場合は空の文字列を選択します。

WITH CTE AS 
(
    Select  distinct top 100000 
        o.EventSetName,       
        o.EventSetDisplay,
        o.EventSetDescription,
        o.ChildSetName,
        ROW_NUMBER() Over (Order By f.ChildSetName) RN,
        f.DocumentDispSequence,
        f.SectionDispSequence,
        o.ObsSetDispSequence,
        null  as NullColumnNeedsName,
        ROW_NUMBER() OVER (PARTITION BY o.EventSetName, o.EventSetDisplay,o.EventSetDescription ORDER BY f.ChildSetName) GRP_RN
    From   ##ObsSetLevel o,
    INNER JOIN ##Final f ON f.ChildSetName = o.EventSetName and o.EventSetName = @variableName
)
SELECT
    CASE WHEN GRP_RN = 1 THEN o.EventSetName ELSE '' END AS EventSetName,
    CASE WHEN GRP_RN = 1 THEN o.EventSetDisplay ELSE '' END AS EventSetDisplay,
    CASE WHEN GRP_RN = 1 THEN o.EventSetDescription ELSE '' END AS EventSetDescription,
    other columns
FROM CTE  
Order By RN asc, DocumentDispSequence asc, SectionDispSequence asc, o.ObsSetDispSequence asc

PS: 古いスタイルの結合の使用も修正しました。その使用法は、SQL-92 標準の導入により 20 年以上前に時代遅れになっています。それらの使用は避けるべきです。

于 2013-09-12T15:28:25.297 に答える