【问题标题】:SQL Several CountSQL 几个计数
【发布时间】:2015-08-23 07:46:53
【问题描述】:

首先抱歉,如果我的英语不好,那不是我的母语。

我有两个表(A 和 B),包含以下列:

答: PRENUMERO (ID)、DATA、ARMAZEM、TIPO

乙: Autoreg (ID)、PRENUMERO、PRODUTO

我想要这样的结果:

*CountA、CountB、CountC、日期*

CountA 是当 PRODUTO 等于 1 时。

CountB 是当 PRODUTO 大于 1 时。

CountC 是当 PRODUTO 在同一个 PRENUMERO 中同时具有 1 和 > 1 时。

我是这样加入表格的:

SELECT DISTINCT
b.[Autoreg],
a.[PRENUMERO],
b.[PRENUMERO],
b.[PRODUTO]
FROM
b.[VendasPOS_Linhas]
JOIN a
ON b.[PRENUMERO]=a.[PRENUMERO]
WHERE
a.[DATA] > '2015-06-01 00:00:00.000' AND
a.[Armazem] = '111'

结果如下:

因此,如果我执行 [PRENUMERO] = '1'(对于 CountA),结果应该是例如 1000,如果我执行 [PRENUMERO] > '1'(对于 CountB),结果应该是例如 1100,而 CountC应该是其余的(667)。但我不知道该怎么做。

正如您在第 11 行和第 12 行中看到的,它们具有相同的 PRENUMERO,但 PRODUTO 是 1,另一个是 10900...所以这是针对 CountC 的。如果 PRENUMERO 是相同的(几个正好是 PRENUMERO),但 PRODUTO 是 1(CountA(如第 8 行和第 9 行))或 >1(CountB),则此计数仅计为 1(此处为 DICTINCT?)

(IF PRODUTO = 1 THEN CountA; IF PRODUTO >1 THEN CountB)

编辑:

所以我这样做了:

SELECT
    (SELECT
    COUNT(DISTINCT [B].[PRENUMERO])
FROM
    [B]
JOIN    [A]
ON    [B].[PRENUMERO] = [A].[PRENUMERO]
WHERE
    [A].[DATA] > '2015-06-01 00:00:00.000' AND
    [A].[Armazem] = '454' AND
    [B].[PRODUTO] > '1') AS X,
    (SELECT
    COUNT(DISTINCT [B].[PRENUMERO])
FROM
   [B]
JOIN    [A]
ON    [B].[PRENUMERO] = [A].[PRENUMERO]
WHERE
    [A].[DATA] > '2015-06-01 00:00:00.000' AND
    [A].[Armazem] = '454' AND
    [B].[PRODUTO] = '1') AS Y,
    (SELECT COUNT([A].[PRENUMERO]) from A where DATA> '2015-06-01 00:00:00.000' and Armazem = '454') AS Total

结果如下:

但我认为这是错误的,因为它也在计算 CountC。

例如: 如果 PRENUMERO 与 1 相同且 >1 它属于 CountC。我能做些什么不计算呢? (如何检查 PRENUMERO 是否没有 1 和 >1(不同的行))

【问题讨论】:

    标签: mysql sql if-statement count conditional-statements


    【解决方案1】:

    MySQL 非常方便,因为它非常容忍类型转换:

    SELECT SUM(PRODUTO = 1) AS countA,
        SUM(PRODUTO > 1) AS countB,
        SUM((PRODUTO = 1) AND (PRENUMERO > 1)) AS countC
    ...
    

    MySQL 将获取 => 测试的布尔值 true/false,将它们转换为整数 01,然后它们将这些整数相加,得到你的计数。

    【讨论】:

    • 我在哪里添加这个?我从来没有对 MySQL 做过这样的事情,我有点困惑
    【解决方案2】:

    好吧,如果我理解你正在尝试做下一个。

    • COUNT A -> 仅产品=1
    • COUNT B -> 仅限产品>1
    • COUNT A -> products=1 AND Prenumero>1

      SELECT SUM(if(producto)=1,1,0) AS COUNT_A ,SUM(if(producto)>1,1,0) AS COUNT_B ,SUM((if(producto)=1 AND PRENUMERO>1),1,0) AS COUNT_C ,a.数据 从 b 加入使用(预数) WHERE a.DATA > '2015-06-01 00:00:00.000' AND a.Armazem = '111' AND b.producto>0 按数据分组;

    您在计数 A 和计数 C 之间共享信息,为了解决这个问题,您可以使用每个表中的别名通过示例进行验证

    a.prenumero>1 AND b.prenumero =1
    

    但如果这是您的内部连接字段,则两个表的值始终相同

    问候。

    【讨论】:

    • COUNT A -> Only products=1 COUNT B -> Only products>1 COUNT A -> products=1 AND Prenumero>1 最后一个是 CountC 并且它有 produto = 1 和 produto >1(例如,您可以在图像的第 11 行和第 12 行看到)您给出的最后一个示例:a.prenumero>1 AND b.prenumero =1 我必须同时检查 produto 而不是 prenumero :S 有什么方法可以检查 PRENUMERO 是否同时具有 1 和 >1(不同的行,如图像中的第 11 行和第 12 行)然后计数?跨度>
    • 那么,我是否应该进行查询以显示重复的 PRENUMERO,然后检查它们是否具有相同 PRENUMERO 的 1 和 >1?
    • 如果 prenumero 不是共享字段,您可以这样做。我的意思是不是外键,并且您没有在 on 语句中使用内部联接的 proyection (select) 中使用。
    【解决方案3】:

    解决方案

    > SELECT    COUNT(DISTINCT CASE WHEN MinProduto = 1 AND MaxProduto = 1
    > THEN PRENUMERO END) AS QtdCombustivel
    >          ,COUNT(DISTINCT CASE WHEN MinProduto <> 1 AND MaxProduto <> 1 THEN PRENUMERO END) AS QtdLoja
    >          ,COUNT(DISTINCT CASE WHEN MinProduto = 1 and MaxProduto <> 1 THEN PRENUMERO END) AS QtdMisto
    >          ,COUNT(DISTINCT PRENUMERO) AS Total FROM (
    >     SELECT  [VendasPOS_Linhas].[PRENUMERO]
    >             ,MIN([VendasPOS_Linhas].[PRODUTO])            AS MinProduto
    >             ,MAX([VendasPOS_Linhas].[PRODUTO])            AS MaxProduto
    >     FROM    [VendasPOS_Linhas]
    >     INNER JOIN [VendasPOS_Cabecalhos]
    >        ON    [VendasPOS_Linhas].[PRENUMERO] = [VendasPOS_Cabecalhos].[PRENUMERO]
    >     WHERE    UPPER([VendasPOS_Cabecalhos].[FACT_VD]) IN ('T','F','C') 
    >       AND    [VendasPOS_Cabecalhos].[DATA] > '2015-06-11 00:00:00.000' 
    >       AND    [VendasPOS_Cabecalhos].[Armazem] = '404' 
    >     GROUP BY [VendasPOS_Linhas].[PRENUMERO] , [VendasPOS_Cabecalhos].[DATA] )Res
    

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2020-01-03
      • 2023-03-21
      • 2016-11-17
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多