我有两个通过某个键关联的表。我需要编写一个查询来根据特定条件从两个表中获取数据

时间:2013-02-18 12:46:15

标签: sql sql-server

表格结构如下。第一个表是subusage,next是machinesubusage.Both与sub_usage_id列相关联。我需要选择subusage.product_key及其相关的使用计数,如果subusage.is_standalone不为null,那么我需要从subusage.usage_count获取相关的使用计数,否则关联的使用计数将是该sub_usage_id的machinesubusage表中的行数。我已经为下面两种情况编写了查询。我尝试了case和if语句来组合这两个查询但是徒劳无功

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

3 个答案:

答案 0 :(得分: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()将null替换为零:

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;

答案 1 :(得分: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

答案 2 :(得分:0)

Mahmoud Gamal发布了一个看似很好的答案。我将在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包含在select子句中但不包含在group by子句中。事实上,如果你进行那么简单的修正,你可能会得到你想要的答案。