SQL SERVER 2012中分组依据的输出
我有下面的代码SQL SERVER 2012中分组依据的输出,sql,sql-server,Sql,Sql Server,我有下面的代码 select S.BUNDLE_ID, S.COUNTRY, SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM from PM_SCOPE S JOIN PM_LOOKUP_VALUE LV ON LV.SCOPE_ID = S.SCOPE_ID JOIN PM_LOOKUP_DEFINITION LD ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_
select S.BUNDLE_ID,
S.COUNTRY,
SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM
from PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
WHERE LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112) > convert(nvarchar, GETDATE(), 112)
AND S.BUNDLE_ID NOT IN (
select distinct BUNDLE_ID
FROM PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
AND LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
where convert(float, LV.VALUE_0) = 0
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112)
> convert(nvarchar, GETDATE(), 112)
)
GROUP BY S.BUNDLE_ID, S.COUNTRY
此查询忽略PM\u LOOKUP\u VALUE
表中的所有BUNDLE\u ID
,其中VALUE\u 0=0
。这里的问题是,即使任何一个国家的值_0
为0,查询也会忽略所有其他国家总和的计算
如果VALUE\u 0
为0,我是否可以在查询中添加一个子句来忽略该特定国家/地区的计算
Country BUNDLE_ID VALUE_0
US BUNDLE1 10
UK BUNDLE1 20
Poland BUNDLE1 0
US BUNDLE2 35
UK BUNDLE2 30
Poland BUNDLE2 10
如果我们看上面的例子,我希望我的查询只忽略波兰的BUNDLE1
,因为它的值0
为0,并且仍然显示我们和英国BUNDLE1
的结果
BUNDLE\u ID
包含一些组件,这就是我需要执行分组并求和的原因
另一个例子:
国家/地区捆绑包\u ID捆绑包\u组件价值\u 0美国捆绑包1 A 10美国捆绑包1 B 15英国捆绑包1 A 5英国捆绑包1 B 20波兰捆绑包1 A 10波兰捆绑包1 B 0波兰捆绑包1 C 30
Bundle_组件也是PM_范围表中的列名。因此,我希望波兰的捆绑1的总和不应该发生,因为B的价格为0,但是对于美国和英国,总和应该计算 是否要按BUNDLE\u ID
和国家/地区进行分组?如果是,则具有
的应有助于:
SELECT S.BUNDLE_ID, S.COUNTRY, SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM
FROM PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
WHERE LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
(...)
GROUP BY S.BUNDLE_ID, S.COUNTRY
HAVING SUM(CONVERT(float,LV.VALUE_0)) > 0
看起来您在BUNDLE\u ID
上的条件应该替换为其他条件。也就是说,这里不需要全部使用子查询。您只需将零测试置于联接条件中:
select S.BUNDLE_ID,
S.COUNTRY,
SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM
from PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
AND COALESCE(convert(float, LV.VALUE_0), 0) <> 0
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
WHERE LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112) > convert(nvarchar, GETDATE(), 112)
GROUP BY S.BUNDLE_ID,
S.COUNTRY
使用和的解决方案也会起作用,但前提是您的值保证为非负。希望这有帮助
select * from ( select S.BUNDLE_ID,
S.COUNTRY,
SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM
from PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
WHERE LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112) > convert(nvarchar, GETDATE(), 112)
AND S.BUNDLE_ID NOT IN (
select distinct BUNDLE_ID
FROM PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
AND LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
where convert(float, LV.VALUE_0) = 0
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112)
> convert(nvarchar, GETDATE(), 112)
)
GROUP BY S.BUNDLE_ID, S.COUNTRY) a where a.BUNDLE_SUM !=0
按S.BUNDLE\u ID、S.COUNTRY分组
有SUM(CONVERT(float,LV.VALUE_0))0我想按BUNDLE_ID和国家进行分组。但是我希望我的查询不进行求和,如果值_0是0(就像我上面的例子中的波兰)Hi,国家/地区捆绑包\u ID捆绑包\u组件价值\u 0美国捆绑包1 a 10美国捆绑包1 B 15英国捆绑包1 a 5英国捆绑包1 B下面的数据更清晰20波兰BUNDLE1 A 10波兰BUNDLE1 B 0波兰BUNDLE1 C 30波兰bundle_组件也是PM_范围表中的列名。因此,我希望波兰的捆绑包1的总和不应该发生,因为B的价格为0,但是对于美国和英国,总和应该进行计算。这不会返回任何内容。所有国家是否都在表PM_LOOKUP_值中有一个条目,条目值为0=0是,它们都将有0。我需要为所有组件值均不为0的国家/地区计算BUNDLE_ID之和。例如,如果意大利的值是0,而波兰的值不是,我希望它能为波兰求和。但现在它只是忽略所有BUNDLE_ID,即使只有一个国家的值为0。我需要它按国家过滤数据并打包。希望它现在更清晰?有任何答案适合您的需要吗?你能接受一个或留下评论吗?
select * from ( select S.BUNDLE_ID,
S.COUNTRY,
SUM(CONVERT(float,LV.VALUE_0)) AS BUNDLE_SUM
from PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
WHERE LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112) > convert(nvarchar, GETDATE(), 112)
AND S.BUNDLE_ID NOT IN (
select distinct BUNDLE_ID
FROM PM_SCOPE S
JOIN PM_LOOKUP_VALUE LV
ON LV.SCOPE_ID = S.SCOPE_ID
JOIN PM_LOOKUP_DEFINITION LD
ON LD.LOOKUP_DEFINITION_ID = LV.LOOKUP_DEFINITION_ID
AND LD.LOOKUP_NAME = 'Competitor Bundle Details - new'
where convert(float, LV.VALUE_0) = 0
AND convert(nvarchar, LV.EFFECTIVE_END_TIME, 112)
> convert(nvarchar, GETDATE(), 112)
)
GROUP BY S.BUNDLE_ID, S.COUNTRY) a where a.BUNDLE_SUM !=0