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