Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linq To Sql或Sql中执行困难的查询_Sql_Linq To Sql - Fatal编程技术网

在Linq To Sql或Sql中执行困难的查询

在Linq To Sql或Sql中执行困难的查询,sql,linq-to-sql,Sql,Linq To Sql,这件事我已经做了两天了,我想不出来。我希望比我聪明的人能试试 假设我有以下表格: 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

这件事我已经做了两天了,我想不出来。我希望比我聪明的人能试试

假设我有以下表格:

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个观察值的记录,但是从这一点上,我陷入了困境

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);

我希望您能用LINQtoSQL或简单的旧Sql来回答我,谢谢

您应该在两个参考表上尝试
交叉连接
,然后
外部连接
返回到“数据”表-然后检查
观察值
是否为空。。。然后分组求和

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将是一个类似的两步过程-在分组和求和之前获取内部结果集(检查观察值是否为空)。

我要感谢您帮助我实现这一点,有时您只需要一双新眼睛:)