SQL Server 如何创建要使用条件计数的表

jutyujz0  于 2023-01-01  发布在  其他
关注(0)|答案(3)|浏览(188)

我有一个数据库,有很多列,列上有通过、失败、空的指示符,我想创建一个函数来计算每种类型的值,并根据计算结果创建一个表。|价值|x| Y型|z||- —————-|- ————————————————-|- —————————————————-|- —-|- —-|- —-|- —-|- —-|- —-|- —-||通过|x=通过时计数| 如果y=通过,则计数| 如果z=通过,则计数|| ||||||失败| 如果x=未通过则计数|如果y=未通过则计数|z=失败时计数|||||| ||空白|x=空白时计数|如果y=空白,则计数|z=空白时计数||||||||总计|计数(x)|计数(y)|计数(z)|||||||
其中x、y、z是来自另一个表的列。
我不知道哪种方法是最好的提前谢谢大家
我试过这个结构,但它显示语法错误

CREATE FUNCTION Countif (columnx nvarchar(20),value_compare nvarchar(10))
RETURNS Count_column_x AS
BEGIN
    IF columnx=value_compare
    count(columnx)
END
RETURN
END

另外,我不知道如何将每个计数添加到我尝试创建的实际表中

l0oc07j2

l0oc07j21#

条件计数(或任何条件聚合)通常可以通过在聚合函数中放置一个CASE表达式来内联完成,该表达式有条件地返回要聚合的值或要跳过的NULL。
例如COUNT(CASE WHEN SelectMe = 1 THEN 1 END)。这里的聚合值是1(可以是COUNT()的任何非空值。(对于其他聚合函数,将提供更有意义的值。)隐式ELSE返回不计数的NULL
对于您的问题,我认为首先要做的是将数据UNPIVOT,将列名和值并排放置。然后可以按值分组,并使用上述条件聚合来计算结果。(1)使用WITH ROLLUP的total行,(2)调整空白行和total行标签的CASE语句,以及(3)一些ORDER BY技巧,以获得正确的结果,这样就完成了。
结果可能类似于:

SELECT
    CASE
        WHEN GROUPING(U.Value) = 1 THEN 'Total'
        WHEN U.Value = '' THEN 'Blank'
        ELSE U.Value
        END AS Value,
    COUNT(CASE WHEN U.Col = 'x' THEN 1 END) AS x,
    COUNT(CASE WHEN U.Col = 'y' THEN 1 END) AS y
FROM @Data D
UNPIVOT (
  Value
  FOR Col IN (x, y)  
) AS U
GROUP BY U.Value WITH ROLLUP
ORDER BY
    GROUPING(U.Value),
    CASE U.Value WHEN 'Pass' THEN 1 WHEN 'Fail' THEN 2 WHEN '' THEN 3 ELSE 4 END,
    U.VALUE

样本数据:
| x| Y型|
| - ------|- ------|
| 通过|通过|
| 通过|未通过|
| 通过||
| 未通过||
样品结果:
| 价值|x| Y型|
| - ------|- ------|- ------|
| 通过|三个|1个|
| 未通过|1个|1个|
| 空白|无|第二章|
| 共计|四个|四个|
有关工作示例,请参见this db<>fiddle

o8x7eapl

o8x7eapl2#

我认为你不需要一个通用的解决方案,像一个函数的值作为参数。
也许,您可以创建一个视图来对数据进行分组,并在调用此视图后按值进行过滤。
视图体应该是这样的

select value, count(*) as Total
from table_name
group by value

你尽管解释你的情况好让我帮你。

bxgwgixi

bxgwgixi3#

您可以通过grouping by状态列执行此操作。

select status, count(*) as total
from some_table
group by status

考虑使用view而不是创建一个全新的表。

create view status_counts as
  select status, count(*) as total
  from some_table
  group by status

然后可以使用select total from status_counts where status = 'pass'或类似的命令,它将运行查询。
您也可以创建一个"materialized view"。这类似于一个视图,但结果被写入一个真实的的表。SQL Server的特殊之处在于它会为您保持此表为最新。

create materialized view status_counts with distribution(hash(status))
  select status, count(*) as total
  from some_table
  group by status

出于性能原因,您可能会对不经常更新的大型表执行此操作。

相关问题