0

複数の列を返すクエリを作成しました。そのうちの1つの列には繰り返しのエントリが含まれています。

FAULT_SHORT_NAME

ATM DOWN DUE TO LINK PROBLEM
ATM DOWN DUE TO LINK PROBLEM
ALL CASSETTES FAULTED
ALL CASSETTES FAULTED
ATM IS MARK DOWN
ATM IS MARK DOWN

ここで、値のカウントが次のように表示されるようにクエリを変更したいと思います

ATM DOWN DUE TO LINK PROBLEM ALL CASSETTES FAULTED  ATM IS MARK DOWN
2                             2                         2

異なる「FAULT_SHORT_NAME」値が存在する可能性があるため、ハードコードできません。元のクエリは

      Select * From ATMStatus S Left Join ATM A on S.ATM=A.Code 
          Left Join EventMsg E On S.Fault=E.Code 
          Where A.ATMStatus=0 AND S.TicketBooked <> 0

FAULT_SHORT_NAMEはテーブル「EventMsg」の列です

4

1 に答える 1

4

PIVOT行ではなく列として値が必要なため、 が必要なようです。これを行うには、静的ピボットまたは動的ピボットの 2 つの方法があります。

静的ピボット、列の値をハードコーディングします。

SELECT *
FROM
(
    Select * 
    From ATMStatus S 
    Left Join ATM A 
        on S.ATM=A.Code 
    Left Join EventMsg E 
        On S.Fault=E.Code 
    Where A.ATMStatus=0 
        AND S.TicketBooked <> 0
) x
PIVOT
(
    count(*)
    for FAULT_SHORT_NAME in ([ATM DOWN DUE TO LINK PROBLEM], 
        [ALL CASSETTES FAULTED], [ATM IS MARK DOWN])
) p

動的ピボット、列は実行時に生成されます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(FAULT_SHORT_NAME) 
                    from EventMsg
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)') 
                ,1,1,'')
set @query 
      = 'SELECT ' + @cols + ' from 
         (
            Select * 
            From ATMStatus S 
            Left Join ATM A 
                on S.ATM=A.Code 
            Left Join EventMsg E 
                On S.Fault=E.Code 
            Where A.ATMStatus=0 
                AND S.TicketBooked <> 0
         ) x
         pivot 
         (
            count(*)
            for FAULT_SHORT_NAME in(' + @cols + ')
         ) p '

execute(@query)

どちらも同じ結果になります。テーブルといくつかのサンプル データに関する追加の詳細を提供していただければ、より正確な例を提供できます。

于 2012-08-23T14:21:57.923 に答える