表格结构如下。第一个表是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
表格结构:
答案 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)
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子句中。事实上,如果你进行那么简单的修正,你可能会得到你想要的答案。