2

小さな SQL クエリについて助けが必要です。次の表を検討してください。

TicketNo | Rules          | Audit Result
---------------------------------
PR123   | some random strings | Audited
PR123   | some random strings | Not Audited
PR123   | some random strings | Audited
PR123   | some random strings | Audited
PR123   | some random strings | Not Audited
PR123   | some random strings | Not Audited
PR123   | some random strings | Audited
PR999   | some random strings | Audited
PR999   | some random strings | Audited
PR999   | some random strings | Audited
PR999   | some random strings | Audited
PR999   | some random strings | Audited
PR111   | some random strings | Not Audited
PR111   | some random strings | Not Audited
PR111   | some random strings | Not Audited
PR111   | some random strings | Not Audited

次の結果が必要です。

Ticket | Count of Audited Rules | Count of NOT-Audited Rules
------------------------------------------------------------    
PR123   |   4           |   3   
PR999   |   5       |   0   
PR111   |   0       |   4   

私は試した:

Select T1.TicketNo,T1.Audited_Count,T2.NonAudited_Count
FROM
(
    Select [TicketNo], COUNT([TicketNo]) AS Audited_Count
    from [Resolved Results$] where [Audit Result] = 'Audited'
    group  by TicketNo
) T1
inner JOIN
(
    Select [TicketNo], COUNT([TicketNo]) AS NonAudited_Count
    from [Resolved Results$] where [Audit Result] <> 'Audited'
    group  by TicketNo
) T2
on T1.[TicketNo] = T2.[TicketNo]

ただし、上記のコマンドは、監査されたルールのみ、または監査されていないルールのみを持つチケットでは機能せず、両方の種類のルールを持つチケットでのみ機能します。

誰かがクエリで私を助けてくれますか?

注意: OleDB では内部結合のみが機能するため、内部結合以外の使用は避けてください。どうもありがとう

編集:ゴードンの最初の答えは理想的には機能するはずですが、残念ながらExcel用のOLEDBドライバーはそれをサポートしていません。ただし、iff(..) を使用するというゴードンの提案は機能しました。

私が使用している最後のクエリは次のとおりです。

select [TicketNo],
       sum(iif([Audit Result] = "AUDITED", 1, 0)) as Audited,
       sum(iif([Audit Result] = "NOT AUDITED", 1, 0)) as NotAudited
from [Resolved Results$]
group by [TicketNo];

ありがとうゴードン!

4

1 に答える 1

6

case条件の合計が必要です。これは、内にステートメントを入れることで実行できますsum()

select ticket,
       sum(case when AuditResult = 'Audited' then 1 else 0 end) as Audited,
       sum(case when AuditResult = 'Not Audited' then 1 else 0 end) as NotAudited
from t
group by ticket;

これは、AuditResult が別の列であることを前提としています。これが の最後のコメントでSomeStringsある場合、クエリは次のようになります。

select ticket,
       sum(case when SomeStrings like '%Audited' and SomeStrings not like '%Not Audited' then 1
                else 0
           end) as Audited,
       sum(case when SomeStrings like '%Not Audited' then 1
                else 0
           end) as NotAudited
from t
group by ticket;
于 2013-09-02T13:26:31.737 に答える