SQL几个计数

时间:2015-06-08 18:00:01

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

首先对不起,如果我的英语不好,那不是我的母语。

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

答 PRENUMERO(ID),DATA,ARMAZEM,TIPO

B: Autoreg(ID),PRENUMERO,PRODUTO

我想要一个结果:

* CountA,CountB,CountC,DATE *

CountA是PRODUTO等于1的时候。

CountB是PRODUTO>比1。

CountC是PRODUTO同时具有1和>的时间。 1在同一个PRENUMERO。

我加入了这样的表:

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'

这就是结果:

enter image description here

因此,如果我[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然后是CountA;如果PRODUTO> 1那么那么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

这就是结果:

enter image description here

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

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

3 个答案:

答案 0 :(得分:0)

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

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

MySQL将采用=>测试的布尔值true / false,将它们转换为整数01,然后将这些整数相加,给出你重要的。

答案 1 :(得分:0)

好吧如果我明白你正试图做下一个。

  • 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.DATA 来自b 加入使用(PRENUMERO)     在哪里a.DATA> ' 2015-06-01 00:00:00.000'       和a.Armazem =' 111'和b.producto> 0 GROUP BY a.DATA;

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

a.prenumero>1 AND b.prenumero =1

但如果这是您的内部联接字段,则两个表的总值将具有相同的值

问候。

答案 2 :(得分:0)

解决方案

> 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