2013-02-18 41 views
1

表结构如下。第一个表是subusage,接下来是machineubusage.Both与sub_usage_id列关联。我需要选择subusage.product_key及其相关的使用计数,如果subusage.is_standalone不为null,那么我需要从subusage.usage_count中获取关联的使用计数,否则关联的使用计数将是该子sub_usage_id的machinesubusage表中的行数。我已经为以下两种情况撰写了查询。我想情况下,如果声明这两个查询组合,却徒劳无功我有两个通过某个键关联的表。我需要编写一个查询来根据一定的条件从这两个表中获取数据。

SELECT SU.product_key,COUNT(*) FROM SubUsage SU 
INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 GROUP BY SU.product_key 

SELECT SU.product_key, SU.usage_count FROM SubUsage SU 
INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 GROUP BY SU.product_key, SU.usage_count 

表的结构:

enter image description here

+0

你试过的情况陈述是什么,你不喜欢它的是什么? – 2013-02-18 12:52:43

+0

SELECT SU.product_key, \t CASE WHEN SU.is_standalone IS NOT NULL THEN SU.usage_count \t ELSE COUNT(*)END \t FROM SubUsage SU INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id WHERE SU。 acct_id = 40897342 GROUP BY SU.product_key,SU.usage_count这些行上的东西,但我知道这是错误的,甚至不会编译。 – almighty 2013-02-18 12:59:53

回答

1

试试这个:

SELECT 
    SU.product_key, 
    SUM(CASE 
     WHEN su.is_standalone IS NOT NULL THEN su.usage_count 
     ELSE MSU.SubUsageCount 
     END) AS TotalCount 
FROM SubUsage SU 
INNER JOIN 
(
    SELECT sub_usage_id, COUNT(*) AS SubUsageCount 
    FROM MachineSubUsage 
    GROUP BY sub_usage_id 
) AS MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
GROUP BY SU.product_key; 

如果您需要包括那些在另一个表中没有匹配的产品密钥,请使用LEFT JOIN而不是ISNULL()将空值替换为零:

SELECT 
    SU.product_key, 
    SUM(CASE 
     WHEN su.is_standalone IS NOT NULL THEN su.usage_count 
     ELSE ISNULL(MSU.SubUsageCount, 0) 
     END) AS TotalCount 
FROM SubUsage SU 
LEFT JOIN 
(
    SELECT sub_usage_id, COUNT(*) AS SubUsageCount 
    FROM MachineSubUsage 
    GROUP BY sub_usage_id 
) AS MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
GROUP BY SU.product_key; 
+0

你不需要做一个SUM,你的子查询已经有了这些数据。 – twoleggedhorse 2013-02-18 13:03:45

+0

@twoleggedhorse是的,如果第二个表中每个'sub_usage_id'只有一个条目,那么你是对的。但是如果每一行有多行,那么你需要对它们进行计数,在这种情况下计数将是两次计数的总和。不确定如果这是他正在寻找或没有。等待OP来决定。 – 2013-02-18 13:06:25

+0

machinesubusage表中将有多个sub_usage_id条目。 – almighty 2013-02-18 13:40:55

0

在SQLServer2005的+试试这个请求

SELECT DISTINCT SU.product_key, SU.usage_count, 
     COUNT(*) OVER(PARTITION BY SU.product_key) 
FROM SubUsage SU JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
0

马哈茂德·贾迈勒已发布这似乎是一个很好的答案。我将解释amit评论中原始案例陈述出了什么问题。在这里它是:

SELECT SU.product_key 
, CASE WHEN SU.is_standalone IS NOT NULL THEN SU.usage_count ELSE COUNT(*) END 
FROM SubUsage SU INNER JOIN MachineSubUsage MSU ON MSU.sub_usage_id = SU.sub_usage_id 
WHERE SU.acct_id = 40897342 
GROUP BY SU.product_key, SU.usage_count 

的问题,应在该错误消息已显示时,是SU.is_standalone被包括在选择子句中但不是group by子句英寸事实上,如果你做了这个简单的更正,你可能会得到你所寻求的答案。

相关问题