简体   繁体   English

如何计算 sql 服务器中多列的方差?

[英]How to calculate variance over multiple columns in sql server?

Using a temporary table which contains a the computed results of many fields, I want to calculate the variance of every column in the table.使用包含许多字段的计算结果的临时表,我想计算表中每一列的方差。 The problem is that the query always returns null If I don't use Coalesce to replace null values by 0. I don't understand as documentation state that null values are ignored with the var and varp functions. The problem is that the query always returns null If I don't use Coalesce to replace null values by 0. I don't understand as documentation state that null values are ignored with the var and varp functions.

Here is how the table look:这是表格的外观: 表数据样本

When running the following query, it gives me null .运行以下查询时,它给了我null

WITH cte
AS (SELECT
  *
FROM [IPA_10])
SELECT
  var("Cell valide" + "Cell invalide" + "Compagnie valide" + "Compagnie invalide" + "Email 1 Invalide" + "Email 2 Invalide"
  + "Adresse Valide" + "Adresse à Valider" + "Adresse Retournée" + "Homme" + "Femme" + "Aucun Genre" +
  "APS Fort" + "APS Moyen" + "APS Faible" + "APS Très Faible" + "Pas d'APS" + "Français" + "Anglais" + "Aucune Langue" +
  "Home Phone Valide" + "Home Phone Invalide" + "MFR" + "Non MFR" + "NAS Valide" + "NAS Invalide" + "Other Phone 1 Valide" +
  "Other Phone 1 Invalide" + "Other Phone 2 Valide" + "Other Phone 2 Invalide" + "Other Phone 3 Valide" + "Other Phone 3 Invalide" +
  "Other Phone 4 Valide" + "Other Phone 4 Invalide" + "Phone Search 1 Valide" + "Phone Search 1 Invalide" + "Phone Search 2 Valide" +
  "Phone Search 2 Invalide" + "Capital - < 100" + "Capital - 100-200" + "Capital - 200-300" + "Capital - 300-400" +
  "Capital - 400-500" + "Capital - 500-600" + "Capital - 600-700" + "Capital - 700-800" + "Capital - 800-900" +
  "Capital - 900-1000" + "Capital - 1000-1500" + "Capital - 1500-2500" + "Capital - > 2500" + "Délinquance – [0-3[" +
  "Délinquance - [3-6[" + "Délinquance - [6-9[" + "Délinquance – [9-12[" + "Délinquance – [12-24[" +
  "Délinquance – [25-36[" + "Délinquance – [36-84[" + "Délinquance – 84 &+" + "DDN - Aucune Valeur" + "Région Saguenay" +
  "Région Outaouais" + "Région Ontario (qc)" + "Région Abitibi-Témiscamingue" + "Région Autres Provinces - États (qc)" +
  "Région Bas Saint-Laurent" + "Région Capitale-Nationale" + "Région Centre-du-Québec" + "Région Chaudière-Appalache" +
  "Région Côte-Nord" + "Région Estrie" + "Région Gaspésie" + "Région Lanaudière" + "Région Laurentides" + "Région Laval" +
  "Région Mauricie" + "Région Montérégie" + "Région Montréal" + "Région Nord-du-Québec" + "Aucune région (qc)")
FROM cte

Using coalsce will give me a result, however form my understanding it would be innacurate because it would then be included in the variance calculation.使用 coalsce 会给我一个结果,但是根据我的理解,这将是不准确的,因为它将被包含在方差计算中。 How can I get the variance over multiple columns?如何获得多列的差异?

After Larnu's comment, I restructured the query like this and it worked.在 Larnu 的评论之后,我像这样重组了查询并且它起作用了。 I added a step to sum all the columns of each row and then calculate the variance on these results.我添加了一个步骤来对每一行的所有列求和,然后计算这些结果的方差。

WITH cte
AS (SELECT
  *
FROM [IPA_10]), cte2 as (
SELECT
  id, coalesce(sum("Cell valide"),0) + coalesce(sum("Cell invalide"),0) + coalesce(sum("Compagnie valide"),0) + coalesce(sum("Compagnie invalide"),0) + coalesce(sum("Email 1 Invalide"),0) + coalesce(sum("Email 2 Invalide"),0) + coalesce(sum("Adresse Valide"),0) + coalesce(sum("Adresse à Valider"),0) + coalesce(sum("Adresse Retournée"),0) + coalesce(sum("Homme"),0) + coalesce(sum("Femme"),0) + coalesce(sum("Aucun Genre"),0) + coalesce(sum("APS Fort"),0) + coalesce(sum("APS Moyen"),0) + coalesce(sum("APS Faible"),0) + coalesce(sum("APS Très Faible"),0) + coalesce(sum("Pas d'APS"),0) + coalesce(sum("Français"),0) + coalesce(sum("Anglais"),0) + coalesce(sum("Aucune Langue"),0) + coalesce(sum("Home Phone Valide"),0) + coalesce(sum("Home Phone Invalide"),0) + coalesce(sum("MFR"),0) + coalesce(sum("Non MFR"),0) + coalesce(sum("NAS Valide"),0) + coalesce(sum("NAS Invalide"),0) + coalesce(sum("Other Phone 1 Valide"),0) + coalesce(sum("Other Phone 1 Invalide"),0) + coalesce(sum("Other Phone 2 Valide"),0) + coalesce(sum("Other Phone 2 Invalide"),0) + coalesce(sum("Other Phone 3 Valide"),0) + coalesce(sum("Other Phone 3 Invalide"),0) + coalesce(sum("Other Phone 4 Valide"),0) + coalesce(sum("Other Phone 4 Invalide"),0) + coalesce(sum("Phone Search 1 Valide"),0) + coalesce(sum("Phone Search 1 Invalide"),0) + coalesce(sum("Phone Search 2 Valide"),0) + coalesce(sum("Phone Search 2 Invalide"),0) + coalesce(sum("Capital - < 100"),0) + coalesce(sum("Capital - 100-200"),0) + coalesce(sum("Capital - 200-300"),0) + coalesce(sum("Capital - 300-400"),0) + coalesce(sum("Capital - 400-500"),0) + coalesce(sum("Capital - 500-600"),0) + coalesce(sum("Capital - 600-700"),0) + coalesce(sum("Capital - 700-800"),0) + coalesce(sum("Capital - 800-900"),0) + coalesce(sum("Capital - 900-1000"),0) + coalesce(sum("Capital - 1000-1500"),0) + coalesce(sum("Capital - 1500-2500"),0) + coalesce(sum("Capital - > 2500"),0) + coalesce(sum("Délinquance – [0-3["),0) + coalesce(sum("Délinquance - [3-6["),0) + coalesce(sum("Délinquance - [6-9["),0) + coalesce(sum("Délinquance – [9-12["),0) + coalesce(sum("Délinquance – [12-24["),0) + coalesce(sum("Délinquance – [25-36["),0) + coalesce(sum("Délinquance – [36-84["),0) + coalesce(sum("Délinquance – 84 &+"),0) + coalesce(sum("DDN - Aucune Valeur"),0) + coalesce(sum("Région Saguenay"),0) + coalesce(sum("Région Outaouais"),0) + coalesce(sum("Région Ontario (qc)"),0) + coalesce(sum("Région Abitibi-Témiscamingue"),0) + coalesce(sum("Région Autres Provinces - États (qc)"),0) + coalesce(sum("Région Bas Saint-Laurent"),0) + coalesce(sum("Région Capitale-Nationale"),0) + coalesce(sum("Région Centre-du-Québec"),0) + coalesce(sum("Région Chaudière-Appalache"),0) + coalesce(sum("Région Côte-Nord"),0) + coalesce(sum("Région Estrie"),0) + coalesce(sum("Région Gaspésie"),0) + coalesce(sum("Région Lanaudière"),0) + coalesce(sum("Région Laurentides"),0) + coalesce(sum("Région Laval"),0) + coalesce(sum("Région Mauricie"),0) + coalesce(sum("Région Montérégie"),0) + coalesce(sum("Région Montréal"),0) + coalesce(sum("Région Nord-du-Québec"),0) + coalesce(sum("Aucune région (qc)"),0) as somme
FROM cte
group by id)
select var(somme) from cte2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM