【问题标题】:How can I fetch 0 results from missing row in group by如何从 group by 中的缺失行中获取 0 个结果
【发布时间】:2021-08-25 01:32:57
【问题描述】:

我正在尝试各种方法来实现这种结果:

问题是从 202001 年开始没有 F。

我创建了 cteTable 并在主选择中加入了他们的公共字段,但它没有给出我预期的输出。左是当前行为,而右是我的预期输出。数量是我的 cteTable 中日期范围 (datefrom - dateto) 的天数。

SELECT GroupID, Gender, COUNT(d) as Quantity, Period
FROM table1
GROUP BY GroupID, Gender, Quantity, Period

【问题讨论】:

  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 为确保每一行都有一个值,您需要一个日历或统计表,您可以在其中构建一个返回所需行的查询,然后加入您的结果。 Example
  • 翻译 - 你需要一个所有性别的“表格”和一个所有时期的“表格”。交叉连接这两个然后将结果外部连接到您的实际表(方便地命名为 table1 - 真的吗?)。现在你如何得到所有可能值的这两张表?在您思考的同时,开始使用最佳实践。使用语句终止符。通常行的顺序很重要 - 所以添加适当的 ORDER BY 子句。
  • 尝试 GROUP BY 数量是没有意义的,因为这是由 COUNT 计算的值(您将其别名为“数量”-您肯定没有名为数量的列吗?)。似乎您有更多问题,因为您的计数(如所需输出中所列)应该评估为 1(1234,M,20201)而不是 5。但也许您根本不想聚合?
  • 谢谢伙计。这正是我的问题。我问了上面的问题以快速发布。我在主查询中有这个参数,我有 execquery 来创建临时日历表。它们具有相同的月数和年数。所以我在 maintable 和日历表中比较这些值。 ``` Select * from (Select 'M' SEX, * from calendartable a UNION ALL Select 'F' SEX, * from calendartable b) calendargender cg LEFT JOIN --我应该使用什么连接? (select * from maintable) main ON main.yearcount = cg.yearcount AND main.monthcount = cg.monthcount AND main.SEX = cg.SEX ```

标签: sql sql-server tsql join


【解决方案1】:

你可以这样做:

select gp.GroupID, g.Gender, gp.Period, COUNT(d) as Quantity
from (values ('M') , ('F')) g(gender)
cross apply (select distinct groupid, period from table1)  gp 
left join table1 t1
on gp.groupid = t1.groupid and gp.period = t1.period and t1.Gender = g.gender
GROUP BY gp.GroupID, g.Gender, gp.Period

【讨论】:

  • 您是否有理由使用cross apply 而不是cross join
  • @GordonLinoff 在那种情况下不是真的,欢迎任何提示
  • 。 .只是cross join是标准SQL,在所有数据库中都可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多