首先对不起,如果我的英语不好,那不是我的母语。
我有两个表(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'
这就是结果:
因此,如果我[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
这就是结果:
但我认为这是错误的,因为它也在计算CountC。
例如: 如果与1和> 1相同的PRENUMERO属于CountC。我能做些什么不算数呢? (如何检查PRENUMERO是否没有1和> 1(不同的行))
答案 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,将它们转换为整数0
和1
,然后将这些整数相加,给出你重要的。
答案 1 :(得分:0)
好吧如果我明白你正试图做下一个。
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