1

私は、アポイントメントタイプ列 (nvarchar) を持つテーブル、セッションを持っています。aptType は、3 つの値 (hour、halfhour、pair) のいずれかです。

必要なのは、クライアント名、時間数、30 分数、ペア数です。

したがって、データは次のようになります

bob | Hour
bob | Hour
bob | halfhour
bob | halfhour
bob | halfhour
bob | Pair

私が欲しいのは

bob | 2 | 3 | 1

このテーマのバリエーションを試しました

select c.firstname,
count(shour.clientid),
count(shalfhour.clientid),
count(sHour.clientid)
From Client as c 
                left  outer join [session] as sHour on c.Entityid = shour.ClientId
                left  outer join [session] as sHalfHour on c.Entityid = sHalfHour.ClientId
                left outer join [session] as sPair on c.Entityid = sPair.ClientId 
                where c.entityid =1 and  (shour.appointmentType = 'Hour' or sHalfHour.appointmentType = 'HalfHour') 
                group by c.firstname

クライアント 1 のデータは、彼が 35 時間の apttypes を持ち、残りは 0 であることです。

上記を行うと、

bob | 1135 | 1135 | 1135

where を an に変更すると、または 0 行が返されます。

とにかく私がやろうとしていることをすることはありますか?

4

2 に答える 2

2

これは単一の結合を使用して実行できCASE、集計関数を持つステートメントを使用してデータをピボットします。

select c.firstname,
    SUM(case when s.appointmentType = 'Hour' then 1 else 0 end) Hour,
    SUM(case when s.appointmentType = 'HalfHour' then 1 else 0 end) HalfHour,
    SUM(case when s.appointmentType = 'Pair' then 1 else 0 end) Pair
From Client as c 
left outer join [session] as s 
    on c.Entityid = s.ClientId
where c.entityid =1
group by c.firstname;

SQL FiddlewithDemoを参照してください

どのRDBMSを指定していませんが、PIVOT関数(Oracle 11g +、SQL Server 2005+)を持つデータベースを使用している場合、クエリは次のようになります。

select firstname, Hour, HalfHour, Pair
from
(
  select c.firstname, s.appointmentType
  from Client as c 
  left outer join [session] as s 
      on c.Entityid = s.ClientId
  where c.entityid =1
) src
pivot
(
  count(appointmentType)
  for appointmentType in (Hour, HalfHour, Pair)
) piv

SQL FiddlewithDemoを参照してください

両方のクエリの結果は次のとおりです。

| FIRSTNAME | HOUR | HALFHOUR | PAIR |
--------------------------------------
|       Bob |    2 |        3 |    1 |
于 2013-01-07T17:30:14.030 に答える
0

グループが定義されているものだけをカウントできるため、カウントを返す最良の方法は、すべてを1つの行にまとめるのではなく、個々の行としてカウントすることです。言い換えれば、これは:

bob | Hour | 2
bob | halfhour | 3
bob | Pair | 1

これの代わりに:

bob | 2 | 3 | 1

そのため、クエリは次のようになります。

SELECT 
  c.firstname,
  c.Entityid,
  count(c.clientid) as ct
FROM Client as c  
GROUP BY c.firstname, c.Entityid

それらを個別の行として取得したら、本当に必要な場合は、そのテーブルを「ピボット」して、すべてを1つの行に結合できます。柔軟性があれば、アプリケーションレベルでこれを行うこともできます。これらの線に沿った何かがそれを行うべきであり、実際にテストされていないので、うまくいけばそれは近いです:

SELECT
   t.firstname,
   SUM(CASE(t.Entityid WHEN 'hour' THEN t.ct ELSE 0)) as hour,
   SUM(CASE(t.Entityid WHEN 'halfhour' THEN t.ct ELSE 0)) as halfhour,
   SUM(CASE(t.Entityid WHEN 'Pair' THEN t.ct ELSE 0)) as Pair
FROM (
    SELECT 
      c.firstname,
      c.Entityid,
      count(c.clientid) as ct
    FROM Client as c  
    GROUP BY c.firstname, c.Entityid
) t
GROUP BY t.firstname
于 2013-01-07T17:26:59.253 に答える