sql - Linq To Sql 或 SQL 中的困难查询

标签 sql linq-to-sql

我已经为此工作了 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 Observations 的记录,因为我在堆积图中使用这些数据,没有它们会引发错误。我已经设法获得了上表,但没有使用以下 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 中得到答案,谢谢!

最佳答案

你应该试试 CROSS JOIN在两个引用表上,然后 OUTER JOIN回到你的“数据”表——然后检查是否Observation为空...然后分组和求和!

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

关于sql - Linq To Sql 或 SQL 中的困难查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534948/

相关文章:

sql - Oracle 11g复合触发器的应用

SQL Server如何将管道分隔的列字符串更改为行

sql - SQL 中的 ORDER BY,其中列是带有嵌入整数的合成字符串

.net - Linq to SQL 错误 SQL 不比较 NText、Text、Xml 或 Image?

LINQ - 本地序列不能用于查询运算符的 LINQ to SQL 实现中,但包含运算符除外

PHP如何从Mysql返回日期时间(6)?

java - SQL 的 CURRENT_TIMESTAMP(通过 JDBC 使用时)与时区无关吗?

asp.net-mvc - 无法使用InsertOnSubmit()插入新的Employee实体

c# - Linq2Sql 存储库模式

sql - Linq to SQL nvarchar问题