差异计算不好 [英] Difference calculation not coming out well

查看:58
本文介绍了差异计算不好的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

亲爱的专家,



计算差异和输出不对。



DIFFCQ1C
DIFFCQ2C

DIFFCQ3C

DIFFCQ4C





请仔细阅读和建议;





数据库MS SQL SERVER 2008



问题区域



COALESCE((C.Q1Y2C-A.Q1Y1C),0)DIFFCQ1C,

COALESCE((C.Q2Y2C-A.Q2Y1C) ),0)DIFFCQ2C,

COALESCE((C.Q3Y2C-A.Q3Y1C),0)DIFFCQ3C,

COALESCE((C.Q4Y2C-A.Q4Y1C), 0)DIFFCQ4C





SELECT A.BRNNAME,A.SCORE,COALESCE(A.Q1Y1C,0)Q1Y1C,COALESCE(C。 Q1Y2C,0)Q1Y2C,

COALESCE(A.Q2Y1C,0)Q2Y1C,COALESCE(C.Q2Y2C,0)Q2Y2C,

COALESCE(A.Q3Y1C,0) Q3Y1C,COALESCE(C.Q3Y2C,0)Q3Y2C,

COALESCE(A.Q4Y1C,0)Q4Y1C,COALESCE(C.Q4Y2C,0)Q4Y2C,

COALESCE((C.Q1Y2C-A.Q1Y1C),0)DIFFCQ1C,

COALESCE((C.Q2Y2C-A.Q2Y1C),0)DIFFCQ2C,

COALESCE( (C.Q3Y2C-A.Q3Y1C),0)DIFFCQ3C,

COALESCE((C.Q4Y2C-A.Q4Y1C),0)DIFFCQ4C

来自Y1C A

加入Y1P B开A.BRNNAME = B.BRNNAME和A.SCORE = B.SCORE

加入Y2C C开A.BRNNAME = C.BRNNAME和A.SCORE = C .SCORE

加入Y2P D ON A.BRNNAME = D.BRNNAME和A.SCORE = D.SCORE

订购A.BRNNAME





BRNNAME SCORE Q1Y1C Q1Y2C Q2Y1C Q2Y2C Q3Y1C Q3Y2C Q4Y1C Q4Y2C DIFFCQ1C DIFFCQ2C DIFFCQ3C DIFFCQ4C

CAPE COAST DELIGHTED 2 2 5 3 2 2 8 7 0 -2 0 -1

CAPE COAST GOOD 1 1 1 0 0 0 1 1 0 0 0 0

HOHOE DELIGHTED 4 0 0 0 4 5 4 4 0 0 1 0

HOHOE GOOD 2 2 0 0 2 2 2 2 0 0 0 0

HOHOE SATISFACT ORY 1 0 1 2 0 0 1 1 0 1 0 0

HOHOE UNHAPPY 1 0 1 1 0 1 1 1 0 0 0 0

KUMASI BAD 1 1 0 0 0 0 1 1 0 0 0 0

KUMASI DELIGHTED 0 0 3 3 3 3 6 6 0 0 0 0

KUMASI GOOD 0 0 1 1 0 0 1 1 0 0 0 0



我尝试了什么:



这些正在建设中的代码。

Dear Expert,

Calculation the differences and output not right.

DIFFCQ1C
DIFFCQ2C
DIFFCQ3C
DIFFCQ4C


Please peruse and advice ;


database MS SQL SERVER 2008

Problem area

COALESCE((C.Q1Y2C-A.Q1Y1C) , 0) DIFFCQ1C ,
COALESCE((C.Q2Y2C-A.Q2Y1C) , 0) DIFFCQ2C ,
COALESCE((C.Q3Y2C-A.Q3Y1C) , 0) DIFFCQ3C ,
COALESCE((C.Q4Y2C-A.Q4Y1C) , 0) DIFFCQ4C


SELECT A.BRNNAME,A.SCORE , COALESCE(A.Q1Y1C, 0) Q1Y1C , COALESCE(C.Q1Y2C, 0) Q1Y2C ,
COALESCE(A.Q2Y1C, 0) Q2Y1C , COALESCE(C.Q2Y2C, 0) Q2Y2C ,
COALESCE(A.Q3Y1C, 0) Q3Y1C , COALESCE(C.Q3Y2C, 0) Q3Y2C ,
COALESCE(A.Q4Y1C, 0) Q4Y1C , COALESCE(C.Q4Y2C, 0) Q4Y2C,
COALESCE((C.Q1Y2C-A.Q1Y1C) , 0) DIFFCQ1C ,
COALESCE((C.Q2Y2C-A.Q2Y1C) , 0) DIFFCQ2C ,
COALESCE((C.Q3Y2C-A.Q3Y1C) , 0) DIFFCQ3C ,
COALESCE((C.Q4Y2C-A.Q4Y1C) , 0) DIFFCQ4C
FROM Y1C A
JOIN Y1P B ON A.BRNNAME=B.BRNNAME AND A.SCORE=B.SCORE
JOIN Y2C C ON A.BRNNAME=C.BRNNAME AND A.SCORE=C.SCORE
JOIN Y2P D ON A.BRNNAME=D.BRNNAME AND A.SCORE=D.SCORE
ORDER BY A.BRNNAME


BRNNAME SCORE Q1Y1C Q1Y2C Q2Y1C Q2Y2C Q3Y1C Q3Y2C Q4Y1C Q4Y2C DIFFCQ1C DIFFCQ2C DIFFCQ3C DIFFCQ4C
CAPE COAST DELIGHTED 2 2 5 3 2 2 8 7 0 -2 0 -1
CAPE COAST GOOD 1 1 1 0 0 0 1 1 0 0 0 0
HOHOE DELIGHTED 4 0 0 0 4 5 4 4 0 0 1 0
HOHOE GOOD 2 2 0 0 2 2 2 2 0 0 0 0
HOHOE SATISFACTORY 1 0 1 2 0 0 1 1 0 1 0 0
HOHOE UNHAPPY 1 0 1 1 0 1 1 1 0 0 0 0
KUMASI BAD 1 1 0 0 0 0 1 1 0 0 0 0
KUMASI DELIGHTED 0 0 3 3 3 3 6 6 0 0 0 0
KUMASI GOOD 0 0 1 1 0 0 1 1 0 0 0 0

What I have tried:

These are codes under construction.

推荐答案

你在错误的级别使用COALESCE。



如果你使用NULL值计算然后整个结果变为NULL。你似乎想要的是将每个NULL值视为0并在计算中使用0。



这是一个非常简单的例子我的意思

You are using COALESCE at the wrong level.

If you use a NULL value in a calculation then the entire result becomes NULL. What you seem to want is to treat each NULL value as 0 and use the 0 in the calculation.

Here is a very simple example of what I mean
DECLARE  @table TABLE (Col1 INT NULL, Col2 INT NULL)

INSERT INTO @table (Col1, Col2) VALUES
(NULL, NULL),
(10, NULL),
(NULL, 10),
(20, 5),
(5, 20)



如果我想列出每行的Col1和Col2之间的差异,我可能会开始这样的事情:


If I want to list the differences between Col1 and Col2 for each row I might start out with something like this:

SELECT Col1 - Col2 FROM @table

但这会给我结果:

NULL
NULL
NULL
15
-15

您的 查询正在执行相当于:

Your query is doing the equivalent of:

SELECT COALESCE(Col1 - Col2,0) FROM @table

给出结果

0
0
0
15
-15



我的 方式是将查询编写为:


My way would be to write the query as:

SELECT ISNULL(Col1,0) - ISNULL(Col2,0) FROM @table

结果:

0
10
-10
15
-15



所以,请注意:

a)我正在合并每列

b我用过ISNULL而不是COALESCE。他们做同样的事情但是当你只有两个项目合并时,ISNULL(显然)稍微快一点。键入更快一点:-)



您的查询应该类似于


So, points to note:
a) I'm coalescing each column individually
b) I've used ISNULL instead of COALESCE. They do exactly the same thing but ISNULL is (apparently) marginally faster when you only have the two items to coalesce. And it is a bit quicker to type :-)

Your query should look something like

SELECT A.BRNNAME,A.SCORE , COALESCE(A.Q1Y1C, 0) Q1Y1C , COALESCE(C.Q1Y2C, 0) Q1Y2C ,
 COALESCE(A.Q2Y1C, 0) Q2Y1C , COALESCE(C.Q2Y2C, 0) Q2Y2C ,
 COALESCE(A.Q3Y1C, 0) Q3Y1C , COALESCE(C.Q3Y2C, 0) Q3Y2C ,
 COALESCE(A.Q4Y1C, 0) Q4Y1C , COALESCE(C.Q4Y2C, 0) Q4Y2C,
 ISNULL(C.Q1Y2C,0)-ISNULL(A.Q1Y1C,0) DIFFCQ1C ,
 ISNULL(C.Q2Y2C,0)-ISNULL(A.Q2Y1C, 0) DIFFCQ2C ,
 ISNULL(C.Q3Y2C,0)-ISNULL(A.Q3Y1C, 0) DIFFCQ3C ,
 ISNULL(C.Q4Y2C,0)-ISNULL(A.Q4Y1C, 0) DIFFCQ4C 
 FROM Y1C A
 JOIN Y1P B ON A.BRNNAME=B.BRNNAME AND A.SCORE=B.SCORE
 JOIN Y2C C ON A.BRNNAME=C.BRNNAME AND A.SCORE=C.SCORE
 JOIN Y2P D ON A.BRNNAME=D.BRNNAME AND A.SCORE=D.SCORE
 ORDER BY A.BRNNAME

但显然我无法对此进行测试。

but obviously I haven't been able to test this.


这篇关于差异计算不好的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆