3

SQL Server 2008-R2 と Transact SQL を使用しています。

複数のテーブル/ビューからデータを返すステータス レポートがあり、UNION を使用して行を「結合」します。

SQL スクリプトからの抜粋は次のとおりです。

    SELECT
    NR.FormStatus AS [Item],
    (SELECT COUNT(PerinatalReportID) FROM NotificationDatesForReport 
        WHERE FormStatus = NR.FormStatus AND NotificationDate BETWEEN dbo.DateNoTime(GetDate()) AND dbo.DateNoTime(GetDate() + 1)) AS [Today],
    (SELECT COUNT(PerinatalReportID) FROM NotificationDatesForReport WHERE FormStatus = NR.FormStatus) AS [Total]   

FROM
    NotificationDatesForReport AS NR

GROUP BY
    NR.FormStatus, NR.DisplayOrder  

UNION ALL

SELECT
    'Distinct password requests',
    (SELECT COUNT(DISTINCT ToEMail) FROM PasswordRequests
        WHERE DateProcessed BETWEEN dbo.DateNoTime(GetDate()) AND dbo.DateNoTime(GetDate() + 1)) AS [Today],
    (SELECT COUNT(DISTINCT ToEMail) FROM PasswordRequests) AS [Total]

これは期待どおりに機能しますが、句を含むスクリプトの最初の部分の項目の順序はGROUP BYランダムな順序で表示されます。私がやりたいのは、スクリプトのそのセクションだけを並べ替えることですが、SORTBY 句がその最後の UNION の後に行かなければならないため、それを行う方法が見つかりません。

すべての提案を歓迎します。

4

4 に答える 4

1

重要なのは、「[X] が [Y] の後に続く」と言うときは、特定の順序を指定しているので、コードでそれを規定する必要があるということです。

私は、最初のSELECTものは によって注文されるべきだと推測していますNR.DisplayOrder。その場合、次のようなものがうまくいくはずです:

    SELECT
    NR.FormStatus AS [Item],
    (SELECT COUNT(PerinatalReportID) FROM NotificationDatesForReport 
        WHERE FormStatus = NR.FormStatus AND NotificationDate BETWEEN dbo.DateNoTime(GetDate()) AND dbo.DateNoTime(GetDate() + 1)) AS [Today],
    (SELECT COUNT(PerinatalReportID) FROM NotificationDatesForReport WHERE FormStatus = NR.FormStatus) AS [Total],
    NR.DisplayOrder
FROM
    NotificationDatesForReport AS NR
GROUP BY
    NR.FormStatus, NR.DisplayOrder  
UNION ALL

SELECT
    'Distinct password requests',
    (SELECT COUNT(DISTINCT ToEMail) FROM PasswordRequests
        WHERE DateProcessed BETWEEN dbo.DateNoTime(GetDate()) AND dbo.DateNoTime(GetDate() + 1)) AS [Today],
    (SELECT COUNT(DISTINCT ToEMail) FROM PasswordRequests) AS [Total],
    999999999 AS DisplayOrder

ORDER BY
    DisplayOrder

ここでは、のすべての部分でソート列を明示的に選択しUNIONているため、結合が完了した後に使用できるようになっていますORDER BYDisplayOrder行の適切な値はDistinct password requests、もちろん、データ型とアプリケーションの詳細によって異なります。

于 2013-05-29T13:09:04.780 に答える
0

ユニオンをすべてラップして一時テーブルに入れます..次に並べ替えます

このような

SELECT * INTO #TMPUNION FROM (
SELECT firstname, lastname FROM TABLE1
UNION ALL
SELECT firstname, lastname FROM TABLE2
)

SELECT * FROM #TMPUNION
ORDER BY FIRSTNAME

tmptable が存在するかどうかを確認してください

編集:あなたが何か他のことをしようとしているのがわかります。

最初のテーブルを #tmptable に入れ、クエリで並べ替えます。

次に、tmptableを結合します

于 2013-05-29T12:53:10.190 に答える
0

組合が関係している場合はいつでも少し「ごまかす」ことができ、注文のためにそれらのそれぞれに追加の列を入れることができます。

; with unions as 
       (
       Select 
           c.name
       ,   c2.name
       ,   1 as 'Order'
       from table1 c 
           join table2 c2 on c.ID =c2.ID
       union
       select 
           c.name
       ,   c2.name
       ,   2
       from table3 c 
           join table4 c2 on c.ID =c2.ID
       )
select *
from unions
order by Order

さらにクレイジーになり、複数列の順序付けを行いたい場合は、次のような最初のユニオン ブロックで row_number over() ウィンドウ関数を使用できます。

row_number over(partition by c.name order by c2.name) as Order

通常、ユニオンブロックをソートしたい場合は、このようなことを行い、行番号プレースホルダーポインターを明示的に配置してから、ネストされた選択でユニオンのブロックを取得するか、CTE でラップします (示されているように)。

于 2013-05-29T14:11:53.213 に答える