4

私はこれに2日間取り組んできましたが、理解できません。私よりも賢い人がこれを試してくれることを願っています。

次のテーブルがあるとします。

Rating:
  Id | Name
  1  | A
  2  | B
  3  | C
  4  | D
  5  | E

Inspection:
  Id | Date (mm/dd/yyyy)
  1  | 01/04/2012
  2  | 04/04/2012
  3  | 28/03/2012
  4  | 04/04/2012

Observation:
  Id | InspectionId | RatingId
  1  | 2            | 3
  2  | 1            | 2
  3  | 4            | 3
  4  | 2            | 1
  5  | 3            | 3
  6  | 1            | 2

クエリが返すようにしたい:

 RatingName | Date(mm/dd/yyyy) | ObservationCount
 A          | 01/04/2012       | 0
 B          | 01/04/2012       | 1
 C          | 01/04/2012       | 1
 D          | 01/04/2012       | 0
 E          | 01/04/2012       | 0
 A          | 04/04/2012       | 1
 B          | 04/04/2012       | 0
 C          | 04/04/2012       | 2
 D          | 04/04/2012       | 0
 E          | 04/04/2012       | 0
 A          | 28/03/2012       | 0
 B          | 28/03/2012       | 0
 C          | 28/03/2012       | 1
 D          | 28/03/2012       | 0
 E          | 28/03/2012       | 0

したがって、各日付の各評価の観測数が必要です。はい、積み上げグラフでこのデータを使用していて、それらがないとエラーがスローされるため、0 観測を返すレコードが必要です。上記のテーブルを取得できましたが、次の Linq To Sql クエリで 0 Observations を返すレコードがありませんが、この時点から行き詰まります。

MyDataContext DB = new MyDataContext();

var data = 
    (from r in DB.Ratings
    join o in DB.Observations on r.Id equals o.RatingId into ro

    from observation in ro.DefaultIfEmpty()
    join i in DB.Inspections on observation.InspectionId equals i.Id into roi

    from q in roi.DefaultIfEmpty()
    group q by new { Name = r.Name, Date = q.Date } into grouped
    select
    new
    {
        RatingName = grouped.Key.Name,
        Date = grouped.Key.Date,
        ObservationCount = grouped.Count(x => x != null)
    }).OrderBy(x => x.Date);

Linq To Sql または単純な古い SQL のいずれかで回答をいただければ幸いです。

4

1 に答える 1

4

CROSS JOIN2つの参照テーブルでを試してOUTER JOINから、「データ」テーブルに戻って、Observationがnullかどうかを確認する必要があります...次にグループ化して合計します。

SELECT 
    [Name],
    [Date],
    SUM([Exists])
FROM
(
SELECT 
    name, 
    [Date],
    CASE WHEN o.Id IS NULL THEN 0
        ELSE 1
    END as [Exists]
FROM 
    Rating r CROSS JOIN
    Inspection i
    LEFT OUTER JOIN Observation o 
        ON o.RatingId = r.Id AND o.InspectionId = i.Id
) as [source]
GROUP BY [Name], [Date]
ORDER BY
    [Date],
    name

LINQへの変換は、同様の2段階のプロセスです。グループ化して合計する前に、内部の結果セットを取得します(観測値がNULLかどうかを確認します)。

于 2012-07-18T05:55:27.997 に答える