SQL查询,基于条件
问题描述:
我的数据是结构化数据的组总结:SQL查询,基于条件
Call_Num Country Item_Num Date
XXX1 GG 1 26-Dec
XXX1 GG 2
YYY1 FF 1 2-Jan
ZZZ1 HH 1
ZZZ1 HH 2
YYY1 II 1 3-Jan
YYY1 II 2 3-Jan
我的目标是获得与Call_Num的重复计数的汇总表,如下所示:
Country Calls_with_date Calls_with_partial_date Calls_with_no_date
GG 0 1 0
FF 1 0 0
HH 0 0 1
II 1 0 0
这是如何在SQL Server中使用查询完成的。我可以得到日期字段的所有实例没有足够简单的日期。但为了将这个分组也纳入等式,对我来说证明有点困难。
假设:
一)将有每个国家的超过1呼叫NUM。为了简单起见,我提到了一个简单的例子。
b)我知道,当总结成上面给出的新表时,我们可能需要使用每列的查询。所以上面的答案可能是三个查询,其中有类似的逻辑。 c)由于没有日期,我的意思是call_num的所有出现都没有指定日期。部分,我的意思是一个或多个可能有一个日期分配。
d)即使表格中有多个,我也只统计一个呼叫,因为每个呼叫可以有多个项目,每个项目可以有一个日期。我关注整体call_num,因此总结中出现分歧。
预先感谢您的时间和帮助。
答
这里是我会怎么做伪代码:
SELECT
SUM(
CASE
WHEN Date IS NOT NULL AND NOT EXISTS(SELECT * FROM MyTable WHERE {SameCountry, SameCallNum} AND Date IS NULL OR (Date IS NOT NULL AND {Item_Num is lower than this one}))
THEN 1
ELSE 0
END
) AS Calls_with_date
, SUM(
CASE
WHEN Date IS NOT NULL AND EXISTS(SELECT * FROM MyTable WHERE {SameCountry, SameCallNum} AND Date IS NULL)
AND NOT EXISTS (SELECT * MyTable WHERE {SameCountry, SameCallNum} AND Date IS NOT NULL AND {Item_Num is lower than this one})
THEN 1
ELSE 0
END
) AS Calls_with_partial_date
, SUM(
CASE
WHEN Date IS NULL AND NOT EXISTS(SELECT * FROM MyTable WHERE {SameCountry, SameCallNum} AND Date IS NOT NULL OR (Date IS NULL AND {Item_Num is lower than this one}))
THEN 1
ELSE 0
END
) AS Calls_with_no_date
FROM MyTable
GROUP BY Country
为什么国家GG和HH只对结果一个日期,当你的数据有两行? –
这并不完全清楚你在这里做什么,但一些聚合和计数应该能够很容易地解决这个问题。例如,为什么II有call_with_date = 1,有两行有日期?帮助我们理解规则,并找到解决方案。 –
你好胡安和肖恩。你的担忧是非常有效的,我对没有说得更清楚表示歉意。我只想用不同的call_num来衡量它。每个呼叫可以有多个部分,每个部分可以有不同的日期。我不担心两部分的日期相同。我关心的是同一个call_num的所有项目是否都有日期。如果是这样,则计为1次呼叫。 – Manus