SQL – 根据条件创建多个列的填充率,并使用 GROUP BY

huangapple go评论80阅读模式
英文:

SQL - Create multiple columns for fill rates based on conditions, with GROUP BY

问题

以下是翻译好的代码部分:

  1. -- 创建临时表
  2. CREATE TABLE #TempTable (
  3. ID varchar(10),
  4. GroupCD varchar(10),
  5. SurrogateKEY1 varchar(10),
  6. SurrogateKEY2 varchar(10)
  7. )
  8. -- 插入示例数据
  9. INSERT INTO #TempTable (ID, GroupCD, SurrogateKEY1, SurrogateKEY2)
  10. VALUES
  11. ('1', 'UNK', '12345', '89225'),
  12. ('3', 'ABC', NULL, '44658'),
  13. ('3', 'DEF', NULL, '99658'),
  14. ('5', 'ABC', '09184', NULL),
  15. ('4', 'DEF', NULL, '85598'),
  16. ('1', 'GHI', '80642', '77890')
  1. -- 计算SurrogateKey列的填充率,按ID分组
  2. SELECT
  3. ID,
  4. CAST(SUM(CASE WHEN SurrogateKEY1 IS NULL THEN 0 ELSE 1 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR,
  5. CAST(SUM(CASE WHEN SurrogateKEY2 IS NULL THEN 0 ELSE 1 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR
  6. FROM #TempTable
  7. GROUP BY ID
  1. -- 扩展查询以基于GroupCD = 'ABC' 或其他代码计算填充率
  2. SELECT
  3. ID,
  4. CAST(SUM(CASE WHEN GroupCD <> 'ABC' THEN CASE WHEN SurrogateKEY1 IS NULL THEN 0 ELSE 1 END ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR_NonABC,
  5. CAST(SUM(CASE WHEN GroupCD = 'ABC' THEN CASE WHEN SurrogateKEY1 IS NULL THEN 0 ELSE 1 END ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR_ClassFilterABC,
  6. CAST(SUM(CASE WHEN GroupCD <> 'ABC' THEN CASE WHEN SurrogateKEY2 IS NULL THEN 0 ELSE 1 END ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR_NonABC,
  7. CAST(SUM(CASE WHEN GroupCD = 'ABC' THEN CASE WHEN SurrogateKEY2 IS NULL THEN 0 ELSE 1 END ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR_ClassFilterABC
  8. FROM #TempTable
  9. GROUP BY ID

希望这些翻译对你有所帮助。

英文:

Some example data:

  1. CREATE TABLE #TempTable (
  2. ID varchar(10),
  3. GroupCD varchar(10),
  4. SurrogateKEY1 varchar(10),
  5. SurrogateKEY2 varchar(10)
  6. )
  7. INSERT INTO #TempTable (ID, GroupCD, SurrogateKEY1, SurrogateKEY2)
  8. VALUES
  9. (&#39;1&#39;, &#39;UNK&#39;, &#39;12345&#39;, &#39;89225&#39;),
  10. (&#39;3&#39;, &#39;ABC&#39;, NULL, &#39;44658&#39;),
  11. (&#39;3&#39;, &#39;DEF&#39;, NULL, &#39;99658&#39;),
  12. (&#39;5&#39;, &#39;ABC&#39;, &#39;09184&#39;, NULL),
  13. (&#39;4&#39;, &#39;DEF&#39;, NULL, &#39;85598&#39;),
  14. (&#39;1&#39;, &#39;GHI&#39;, &#39;80642&#39;, &#39;77890&#39;)
ID GroupCD SurrogateKEY1 SurrogateKEY2
1 UNK 12345 89225
3 ABC NULL 44658
3 DEF NULL 99658
5 ABC 09184 NULL
4 DEF NULL 85598
1 GHI 80642 77890

I would like to calculate the fill rates for the SurrogateKey columns, grouped by the IDs, which I have code for:

  1. SELECT
  2. ID,
  3. CAST(SUM(CASE WHEN SurrogateKEY1 IS NULL THEN 0 ELSE 1 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR,
  4. CAST(SUM(CASE WHEN SurrogateKEY2 IS NULL THEN 0 ELSE 1 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR
  5. FROM #TempTable
  6. GROUP BY ID
ID SurrogateKEY1_fR SurrogateKEY2_fR
1 100.000 100.000
3 0.000 100.000
4 0.000 100.000
5 100.000 0.000

I'd like to expand this query so the fill rate calculation will be based on the GroupCD = 'ABC' or every other code.

I would like the output to be:

ID SurrogateKEY1_fR_NonABC SurrogateKEY1_fR_ClassFilterABC SurrogateKEY2_fR_NonABC SurrogateKEY2_fR_ClassFilterABC
1 100.000 0.000 100.000 0.000
3 0.000 0.000 100.000 100.000
4 0.000 0.000 100.000 0.000
5 0.000 100.000 0.000 0.000

Does anybody know how to leverage CASE statements or another avenue in order to produce this output?

答案1

得分: 2

以下是翻译好的代码部分:

  1. SELECT
  2. ID,
  3. CAST(SUM(CASE WHEN GroupCD &lt;&gt; 'ABC' AND SurrogateKEY1 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR_NonABC,
  4. CAST(SUM(CASE WHEN GroupCD = 'ABC' AND SurrogateKEY1 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR_ClassFilterABC,
  5. CAST(SUM(CASE WHEN GroupCD &lt;&gt; 'ABC' AND SurrogateKEY2 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR_NonABC,
  6. CAST(SUM(CASE WHEN GroupCD = 'ABC' AND SurrogateKEY2 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR_ClassFilterABC
  7. FROM #TempTable
  8. GROUP BY ID

请注意,上述代码是SQL查询的一部分,用于计算不同条件下的百分比。

英文:

Its can be done this way :

  1. SELECT
  2. ID,
  3. CAST(SUM(CASE WHEN GroupCD &lt;&gt; &#39;ABC&#39; AND SurrogateKEY1 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR_NonABC,
  4. CAST(SUM(CASE WHEN GroupCD = &#39;ABC&#39; AND SurrogateKEY1 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY1_fR_ClassFilterABC,
  5. CAST(SUM(CASE WHEN GroupCD &lt;&gt; &#39;ABC&#39; AND SurrogateKEY2 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR_NonABC,
  6. CAST(SUM(CASE WHEN GroupCD = &#39;ABC&#39; AND SurrogateKEY2 IS NOT NULL THEN 1 ELSE 0 END) / CAST(COUNT(1) AS FLOAT) * 100 AS Decimal(8,3)) AS SurrogateKEY2_fR_ClassFilterABC
  7. FROM #TempTable
  8. GROUP BY ID

The result is a little bit different that you expected :

Demo here

答案2

得分: 1

我建议使用 CTEPIVOT

  1. ;WITH CTE AS
  2. (
  3. SELECT ID,
  4. GrpKey = CASE WHEN GroupCD = 'ABC' THEN GroupCD ELSE 'NonABC' END,
  5. SurrogateKEY1fr = CASE WHEN SurrogateKEY1 IS NULL THEN 0.0 ELSE 1.0 END,
  6. SurrogateKEY2fr = CASE WHEN SurrogateKEY2 IS NULL THEN 0.0 ELSE 1.0 END
  7. FROM TempTable
  8. ),
  9. P1 AS
  10. (
  11. SELECT ID, [ABC] AS ABCKEY1fr, [NonABC] AS NonABCKEY1fr
  12. FROM CTE AS DT
  13. PIVOT(MAX(SurrogateKEY1fr) FOR GrpKey IN([ABC], [NonABC])) AS PVT
  14. ),
  15. P2 AS
  16. (
  17. SELECT ID, [ABC] AS ABCKEY2fr, [NonABC] AS NonABCKEY2fr
  18. FROM CTE AS DT
  19. PIVOT(MAX(SurrogateKEY2fr) FOR GrpKey IN([ABC], [NonABC])) AS PVT
  20. )
  21. SELECT P1.ID, COALESCE(P1.ABCKEY1fr, 0.0) * 100.0 AS ABCKEY1fr,
  22. COALESCE(P1.NonABCKEY1fr, 0.0) * 100.0 AS NonABCKEY1fr,
  23. COALESCE(P2.ABCKEY2fr, 0.0) * 100.0 AS ABCKEY2fr,
  24. COALESCE(P2.NonABCKEY2fr, 0.0) * 100.0 AS NonABCKEY2fr
  25. FROM P1
  26. INNER JOIN P2
  27. ON P2.ID = P1.ID;

SQL Fiddle

英文:

I'd suggest to use CTE and PIVOT.

  1. ;WITH CTE AS
  2. (
  3. SELECT ID,
  4. GrpKey = CASE WHEN GroupCD = &#39;ABC&#39; THEN GroupCD ELSE &#39;NonABC&#39; END,
  5. SurrogateKEY1fr = CASE WHEN SurrogateKEY1 IS NULL THEN 0.0 ELSE 1.0 END,
  6. SurrogateKEY2fr = CASE WHEN SurrogateKEY2 IS NULL THEN 0.0 ELSE 1.0 END
  7. FROM TempTable
  8. ),
  9. P1 AS
  10. (
  11. SELECT ID, [ABC] AS ABCKEY1fr, [NonABC] AS NonABCKEY1fr
  12. FROM CTE AS DT
  13. PIVOT(MAX(SurrogateKEY1fr) FOR GrpKey IN([ABC], [NonABC])) AS PVT
  14. ),
  15. P2 AS
  16. (
  17. SELECT ID, [ABC] AS ABCKEY2fr, [NonABC] AS NonABCKEY2fr
  18. FROM CTE AS DT
  19. PIVOT(MAX(SurrogateKEY2fr) FOR GrpKey IN([ABC], [NonABC])) AS PVT
  20. )
  21. SELECT P1.ID, COALESCE(P1.ABCKEY1fr, 0.0) * 100.0 AS ABCKEY1fr,
  22. COALESCE(P1.NonABCKEY1fr, 0.0) * 100.0 AS NonABCKEY1fr,
  23. COALESCE(P2.ABCKEY2fr, 0.0) * 100.0 AS ABCKEY2fr,
  24. COALESCE(P2.NonABCKEY2fr, 0.0) * 100.0 AS NonABCKEY2fr
  25. FROM P1
  26. INNER JOIN P2
  27. ON P2.ID = P1.ID;

SQL Fiddle

答案3

得分: 1

不需要分开两个COUNT()函数的结果。<br/>
您可以使用AVG()聚合函数简化条件聚合:

  1. SELECT ID,
  2. 100 * AVG(CASE WHEN GroupCD &lt;&gt; 'ABC' AND SurrogateKEY1 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY1_fR_NonABC,
  3. 100 * AVG(CASE WHEN GroupCD = 'ABC' AND SurrogateKEY1 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY1_fR_ClassFilterABC,
  4. 100 * AVG(CASE WHEN GroupCD &lt;&gt; 'ABC' AND SurrogateKEY2 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY2_fR_NonABC,
  5. 100 * AVG(CASE WHEN GroupCD = 'ABC' AND SurrogateKEY2 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY2_fR_ClassFilterABC
  6. FROM #TempTable
  7. GROUP BY ID;
  8. 请参见[演示][1]&lt;br/&gt;
  9. [1]: https://dbfiddle.uk/JPOumTPr
  10. <details>
  11. <summary>英文:</summary>
  12. There is no need to divide the results of 2 aggregate `COUNT()`s.&lt;br/&gt;
  13. You can simplify the conditional aggregation with `AVG()` aggregate function:
  14. SELECT ID,
  15. 100 * AVG(CASE WHEN GroupCD &lt;&gt; &#39;ABC&#39; AND SurrogateKEY1 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY1_fR_NonABC,
  16. 100 * AVG(CASE WHEN GroupCD = &#39;ABC&#39; AND SurrogateKEY1 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY1_fR_ClassFilterABC,
  17. 100 * AVG(CASE WHEN GroupCD &lt;&gt; &#39;ABC&#39; AND SurrogateKEY2 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY2_fR_NonABC,
  18. 100 * AVG(CASE WHEN GroupCD = &#39;ABC&#39; AND SurrogateKEY2 IS NOT NULL THEN 1.0 ELSE 0.0 END) AS SurrogateKEY2_fR_ClassFilterABC
  19. FROM #TempTable
  20. GROUP BY ID;
  21. See the [demo][1].&lt;br/&gt;
  22. [1]: https://dbfiddle.uk/JPOumTPr
  23. </details>

huangapple
  • 本文由 发表于 2023年3月4日 04:18:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/75631539.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定