COUNT()在某列

时间:2016-11-22 20:23:14

标签: sql database

要求:我想知道每个人发布了多少张图片。

因此,我创建了一个表模式,如下所示。

Table=Person
==========
Id (PK) , Column1, Column2, LId (FK)

Table=ListMaster
============
Id (PK) , LId (Unique)

Table = ListDetail
===========
Id (PK), LId(FK), DataId(FK)

Table = Image
=========
Id (PK), Column1, Column2

并使用查询SQL

SELECT  Person.Id AS PersonId,
        Person.Column1 AS PersonC1,
        Person.Column2 AS PersonC2, 
        COUNT(Image.Id) AS ImageCount
FROM Person
LEFT OUTER JOIN ListMaster ON Person.LId = ListMaster.LId
LEFT OUTER JOIN ListDetail ON ListDetail.LId = ListMaster.LId
LEFT OUTER JOIN Data AS Image ON ListDetail.DataId = Image.Id
GROUP BY Person.Id,
         Person.Column1,
         Person.Column2

我注意到某个人" ImageCount"有" 0"虽然他之前发布了一些图片。

你能告诉我如何解决我的疑问或者告诉我,在逻辑上可以做我想做的事吗?我怀疑我的桌面设计出了问题。

Sample Data
=======

Table = Person

Id (PK)(bigint identity) | Column1 (nvarchar(max)) | Column2 (nvarchar(max)) | LId (FK) (bigint [null])

1  |  Test 1 C1 | Test1 C2  | 1

2  |  Test 2 C1 | Test 2 C2 | 2

3 |   Test 3 C1 | Test 3 C2  | NULL

4 |   Test 4 C1 | Test 4 C4 |  37

Table = ListMaster

Id (PK)(bigint)(identity) | LId (Unique)(bigint)

1  |  1

2  |  2

3  |  37

Table = ListDetail



  Id (PK)(bigint identity)| LId(FK)(bigint not null)| DataId(FK)(bigint not null)
1  |  1 |  1

2  |  1 |  2

3  |  2 |  3

4  |  37 | 4

Table = Image

Id (PK)(big int not null)(identity) | Column1 (nvarchar(max)) | Column2 (nvarchar(max))

1 | Location 1  | Dummy Data 1

2 | Location 2  | Dummy Data 2

3 | Location 3 |  Dummy Data 3

4 | Location 4  |  Dummy Data 4

我希望COUNT(Image.Id)AS ImageCount应该返回

2
1
0
1

但它返回

2
1
0
0

编辑1:更改表格设计

编辑2:添加样本数据

3 个答案:

答案 0 :(得分:2)

如果您说Image.Id列已宣布为NOT NULL,那么COUNT(Image.Id) PersonLEFT JOIN的唯一原因就是{ {1}}找不到给定Image的任何Person。在这种情况下,基础结果中的Image.Id将为NULL,因此COUNT(Image.id)将为零。这意味着:

  • 有一个Person没有任何ListMaster条目。
  • 有一个ListMaster没有任何ListDetail条目。
  • 有一个ListDetail条目,没有任何Data条目。

......或上述的某种组合。

您应该能够通过将适当的表的COUNT添加到现有查询来快速检查哪些链接丢失了:

SELECT  Person.Id AS PersonId,
        Person.Column1 AS PersonC1,
        Person.Column2 AS PersonC2, 

        -- NEXT TWO COUNTS ADDED FOR DEBUGGING
        COUNT(ListMaster.LId) AS ListMasterCount,
        COUNT(ListDetail.LId) AS ListDetailCount,

        COUNT(Image.Id) AS ImageCount
FROM Person
LEFT OUTER JOIN ListMaster ON Person.LId = ListMaster.LId
LEFT OUTER JOIN ListDetail ON ListDetail.LId = ListMaster.LId
LEFT OUTER JOIN Data AS Image ON ListDetail.DataId = Image.Id
GROUP BY Person.Id,
         Person.Column1,
         Person.Column2

答案 1 :(得分:1)

看起来您的查询和数据应该返回您期望的值。这是实际的架构,数据和查询,还是您正在简化这篇文章?我假设您的实际数据不包括"测试1 C1和#34;等等。您是否创建了具有这些虚拟字段名称和值的数据库来进行此测试,或者您是说这相当于你真的拥有什么?如果这不是实际的东西,很可能是因为在简化中你遗漏了导致问题的原因。

如果我的查询没有给出预期的结果,我会尝试删除部分查询以查看问题所在。就像只尝试第一次加入一样,看看你是否得到了预期的结果。如果可行,请添加第二个连接等。省略GROUP BY并只转储所有记录,这样您就可以看到实际记录而不仅仅是计数。

有许多可能的麻烦来源。也许这些数据并不是您的想法。也许其中一个连接使用了错误的字段。也许您遇到了麻烦,因为您有不同的数据类型,并且转换无法提供您期望的结果。等

答案 2 :(得分:0)

尝试此操作以检查您的所有Id, Column1, Column2是否都有图片

SELECT  Person.Id AS PersonId,
        Person.Column1 AS PersonC1,
        Person.Column2 AS PersonC2, 
        ListMaster.*,
        ListDetail.*,
        Data.*
FROM Person
LEFT OUTER JOIN ListMaster ON Person.LId = ListMaster.LId
LEFT OUTER JOIN ListDetail ON ListDetail.LId = ListMaster.LId
LEFT OUTER JOIN Data AS Image ON ListDetail.DataId = Image.Id
ORDER BY Person.Id,
         Person.Column1,
         Person.Column2