减去两个COUNT(*)语句返回正确的数字,但返回12,000行

时间:2019-02-14 20:33:18

标签: sql ms-access

我想减去它们以显示上周任务的总收益(或损失)。结果返回正确的结果,但为12,000次。

我有两个查询,每个查询返回一个数字6和4。我想将它们减去以显示上周任务的总收益(或损失)。

SELECT (SELECT Count(*) FROM db1 WHERE db1.[creation date] >Date()-7)
      -(SELECT Count(*) FROM db1 WHERE db1.[completed date] >Date()-7)
FROM db1

当我运行此查询时,它返回正确的数字,但会重复该数字12,000次,每条记录一次。我只希望返回一个数字,以便可以在表单的文本框中使用它。

6 个答案:

答案 0 :(得分:1)

我想你想要

SELECT (SUM(IIF(db1.[creation date] > Date() - 7, 1, 0)) -
        SUM(IIF(db1.[completed date] > Date()-7, 1, 0))
       )
FROM db1;

您正在混淆子查询和外部查询。在您的版本中,您要查询db1(整个表)。这不是聚合查询,因此返回每一行。结果包含什么?它包含子查询的结果-但每行重复一次。您可以将db1.*添加到select来查看。

此版本是聚合查询。它使用条件聚合来获得结果。而且,它也应该比您的版本快得多。

答案 1 :(得分:1)

我可能建议使用以下方法代替条件聚合:

select a.c1 - b.c2
from
(select count(*) as c1 from db1 where db1.[creation date]  > Date()-7) a,
(select count(*) as c2 from db1 where db1.[completed date] > Date()-7) b

以上使用笛卡尔乘积(也称为交叉联接)。这意味着,对于从第一个表输出的每个记录,从第二个表输出每个记录(即,输出的记录总数是每个表中的记录数相乘)。

但是,由于此特定笛卡尔积中的每个子查询只会返回一个记录(在给定条件下,count(*)的结果),因此最终结果来源于包含以下内容的数据集: 1x1 = 1记录中包含两个要减去的值。

答案 2 :(得分:0)

将查询更改为此:

SELECT Count(*) - (
    SELECT Count(*)
    FROM db1
    WHERE [completed date] > Date()-7
) AS diff
FROM db1
WHERE [creation date] > Date()-7;

答案 3 :(得分:0)

我认为将值输入表单字段的一种更优化(更容易)的方法是按照以下方式使用函数:

<style>
.fancybox-button--fb {
  padding: 14px;
}

.fancybox-button--tw {
  padding: 13px;
}

.fancybox-button--close {
  padding: 9px;
}

.fancybox-button--fb svg path,
.fancybox-button--tw svg path {
  stroke-width: 0;
}
</style>

<script>

// Create templates for buttons
$.fancybox.defaults.btnTpl.fb = '<button data-fancybox-fb class="fancybox-button fancybox-button--fb" title="Facebook">' +
  '<svg viewBox="0 0 24 24">' +
  '<path d="M22.676 0H1.324C.594 0 0 .593 0 1.324v21.352C0 23.408.593 24 1.324 24h11.494v-9.294h-3.13v-3.62h3.13V8.41c0-3.1 1.894-4.785 4.66-4.785 1.324 0 2.463.097 2.795.14v3.24h-1.92c-1.5 0-1.793.722-1.793 1.772v2.31h3.584l-.465 3.63h-3.12V24h6.115c.733 0 1.325-.592 1.325-1.324V1.324C24 .594 23.408 0 22.676 0"/>' +
  '</svg>' +
  '</button>';

$.fancybox.defaults.btnTpl.tw = '<button data-fancybox-tw class="fancybox-button fancybox-button--tw" title="Twitter">' +
  '<svg viewBox="0 0 24 24">' +
  '<path d="M23.954 4.57c-.885.388-1.83.653-2.825.774 1.013-.61 1.793-1.574 2.162-2.723-.95.556-2.005.96-3.127 1.185-.896-.96-2.173-1.56-3.59-1.56-2.718 0-4.92 2.204-4.92 4.918 0 .39.044.765.126 1.124C7.69 8.094 4.067 6.13 1.64 3.16c-.427.723-.666 1.562-.666 2.476 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.06c0 2.386 1.693 4.375 3.946 4.828-.413.11-.85.17-1.296.17-.314 0-.615-.03-.916-.085.63 1.952 2.445 3.376 4.604 3.416-1.68 1.32-3.81 2.105-6.102 2.105-.39 0-.78-.022-1.17-.066 2.19 1.394 4.768 2.21 7.557 2.21 9.054 0 14-7.497 14-13.987 0-.21 0-.42-.016-.63.962-.69 1.8-1.56 2.46-2.548l-.046-.02z"/>' +
  '</svg>' +
  '</button>';

// Make buttons clickable using event delegation
$('body').on('click', '[data-fancybox-fb]', function() {
  window.open("https://www.facebook.com/sharer/sharer.php?u="+encodeURIComponent(window.location.href)+"&t="+encodeURIComponent(document.title), '','left=0,top=0,width=600,height=300,menubar=no,toolbar=no,resizable=yes,scrollbars=yes');
});

$('body').on('click', '[data-fancybox-tw]', function() {
  window.open('https://replaceme.please');
});


// Custom options
$( '[data-fancybox="images"]' ).fancybox({
  buttons : [
    'fb',
    'tw',
    'close'
  ]
});


</script>
<h2>fancyBox v3.2 - Custom toolbar button</h2>

<p>
  <a href="https://c1.staticflickr.com/9/8148/29324593462_abebaddc38_k.jpg" data-fancybox="images">
    <img src="https://c1.staticflickr.com/9/8148/29324593462_f890687b7a_m.jpg" />
  </a>

  <a href="https://farm6.staticflickr.com/5820/30164525694_af1a1553df_k_d.jpg" data-fancybox="images">
    <img src="https://farm6.staticflickr.com/5820/30164525694_ec5f32fb0f_m_d.jpg" />
</a>

  <a href="https://farm1.staticflickr.com/560/31434966252_8e1bc946da_b_d.jpg" data-fancybox="images">
      <img src="https://farm1.staticflickr.com/560/31434966252_8e1bc946da_m_d.jpg" />
  </a>
</p>

尽管您可能需要对它进行一些调整(从语法上),但是距我已经在这台计算机上安装了访问权限已有好几年了。 :)

答案 4 :(得分:-1)

尝试

SELECT * FROM (
(SELECT Count() FROM db1 WHERE db1.[creation date] >Date()-7) -
(SELECT Count() FROM db1 WHERE db1.[completed date] >Date()-7)
)

ps:未经测试!

答案 5 :(得分:-1)

您将返回12,000行,因为表db1具有12,000行。您需要对只有一个记录的表使用FROM子句,并在Oracle中创建一个等效于DUAL的表。

尝试一下:

-- Create DUAL Table
CREATE TABLE DUAL
(
   DUMMY VARCHAR(1)
);

INSERT INTO DUAL (DUMMY) VALUES ('X');

--Use Dual Table for your computation
SELECT 
(SELECT Count(*) FROM db1 WHERE db1.[creation date] >Date()-7)
-
(SELECT Count(*) FROM db1 WHERE db1.[completed date] >Date()-7) AS COUNT_DIFF
FROM DUAL;