【发布时间】:2018-04-17 12:40:47
【问题描述】:
我有以下表格:
STUDYA (别名 J)
LOGINID RCD_NUM DATE TYPE
8745 0 04/15/2018 PRELIM
6548 0 08/19/2017 PRELIM
7445 0 10/02/2017 PRELIM
2867 0 03/19/2018 PRELIM
试用版(别名 G)
LOGINID RCD_NUM DATE TYPE
8745 0 02/15/2017 ROLLUP
7445 0 07/09/2016 ROLLUP
2867 0 05/17/2017 ROLLUP
2867 0 05/28/2017 ROLLUP
5249 0 06/20/2017 ROLLUP
1335 0 09/29/2017 ROLLUP
9238 0 12/03/2017 ROLLUP
SPRINT (别名 H)
LOGINID RCD_NUM DATE TYPE
5521 0 01/10/2018 SPRNT
8745 1 04/04/2018 SPRNT
3487 0 11/14/2017 SPRNT
6627 0 05/05/2018 SPRNT
还有另一个名为 LOGIN 的表,我正在匹配 LOGINID。
我在 SQL Server 2014 上运行以下查询:
SELECT 'COUNTS', COUNT(G.LOGINID), COUNT(H.LOGINID), COUNT(J.LOGINID)
FROM LOGIN F
LEFT OUTER JOIN TRIALS G ON F.LOGINID= G.LOGINID AND G.RCD_NUM =
F.RCD_NUM
LEFT OUTER JOIN SPRINT H ON F.LOGINID= H.LOGINID AND H.RCD_NUM =
F.RCD_NUM
LEFT OUTER JOIN STUDYA J ON F.LOGINID= J.LOGINID AND J.RCD_NUM =
F.RCD_NUM
WHERE ( ( F.EFFDT =
(SELECT MAX(F_ED.EFFDT) FROM PS_JOB F_ED
WHERE F.LOGINID = F_ED.LOGINID
AND F.RCD_NUM = F_ED.RCD_NUM
AND F_ED.EFFDT <= SUBSTRING(CONVERT(CHAR,GETDATE(),121), 1, 10))
AND F.EFFSEQ =
(SELECT MAX(F_ES.EFFSEQ) FROM PS_JOB F_ES
WHERE F.LOGINID = F_ES.LOGINID
AND F.RCD_NUM = F_ES.RCD_NUM
AND F.EFFDT = F_ES.EFFDT) )
这是上述查询的结果:
(No column name) (No column name) (No column name) (No column name)
COUNTS 9 5 5
您可以看到最后一列 (COUNT(J.LOGINID)) 显示 5 条记录,而在实际表中(上述查询)实际上只有 4 > 记录。我认为是因为 LOGINID 2867 在 TRIALS 表中有 2 行,在 STUDYA 中有 1 行。
我对此进行了研究,建议似乎是在加入之前进行聚合。不过,我正在努力寻找最好的方法。任何帮助表示赞赏!
【问题讨论】:
-
我强烈建议您不要使用
g、h、j作为表别名。您正在混淆您的代码。表名不长,TRIALS.LOGINID仅比G.LOGINID长 5 个字符但显着易于调试、维护等。 -
您的示例数据也与您的示例输出不匹配。
TRIALS中有 7 行,但您的示例输出显示 9? -
我厌倦了您的解决方案,但是我收到一条错误消息:每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。有任何想法吗?谢谢!
标签: sql tsql count left-join sql-server-2014