我有一个数据库,有很多列,列上有通过、失败、空的指示符,我想创建一个函数来计算每种类型的值,并根据计算结果创建一个表。|价值|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
另外,我不知道如何将每个计数添加到我尝试创建的实际表中
3条答案
按热度按时间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
技巧,以获得正确的结果,这样就完成了。结果可能类似于:
样本数据:
| x| Y型|
| - ------|- ------|
| 通过|通过|
| 通过|未通过|
| 通过||
| 未通过||
样品结果:
| 价值|x| Y型|
| - ------|- ------|- ------|
| 通过|三个|1个|
| 未通过|1个|1个|
| 空白|无|第二章|
| 共计|四个|四个|
有关工作示例,请参见this db<>fiddle。
o8x7eapl2#
我认为你不需要一个通用的解决方案,像一个函数的值作为参数。
也许,您可以创建一个视图来对数据进行分组,并在调用此视图后按值进行过滤。
视图体应该是这样的
你尽管解释你的情况好让我帮你。
bxgwgixi3#
您可以通过grouping by状态列执行此操作。
考虑使用view而不是创建一个全新的表。
然后可以使用
select total from status_counts where status = 'pass'
或类似的命令,它将运行查询。您也可以创建一个"materialized view"。这类似于一个视图,但结果被写入一个真实的的表。SQL Server的特殊之处在于它会为您保持此表为最新。
出于性能原因,您可能会对不经常更新的大型表执行此操作。