条件计数 Return 在 SQL

Conditional Counting Return In SQL

我看过这些示例,我认为我应该使用 JOIN,但我无法获得正确的语法,这只不过是错误。我需要 return 一个 table 根据标准显示计数。

我的程序是这样的

SELECT  SalesMan, Count(SalesMan) AS SalesCount 
FROM  Customers
WHERE SaleDate Between @BeginDate And @EndDate AND Status = 'SOLD' 
GROUP BY SalesMan 
ORDER BY SalesCount DESC  

SELECT DISTINCT SalesMan2, Count(Salesman2)   AS HalfCount  
FROM  Customers
WHERE SaleDate   Between @BeginDate And @EndDate AND Status = 'SOLD'   
GROUP BY SalesMan2   
ORDER BY HalfCount DESC

这 Return 两个 table 看起来像这样

SalesMan | SalesCount

BOB        8
ANDY       5
JOE        3

SalesMan2 | HalfCount

(blank)    40
ANDY       1
JACOB      1
ROB        1
JOE        1

我试图实现的逻辑是.. 如果他们是推销员加 1,如果他们是推销员 2 则加 .5。另外,我在第二个 table 中得到了一堆我不关心的空洞。我不需要那些。

我需要的是return这个

Salesman | SalesCount

BOB       8
ANDY      5.5
JOE       3.5
JACOB     .5
ROB       .5

我看过很多答案,但他们使用了带有 where 子句和字符串的连接。他们也知道他们应该匹配什么价值。 任何帮助我指出正确方向的帮助将不胜感激。 提前致谢。

数据库未规范化,这将使此查询比需要的更困难。虽然坚持这种结构,但这里是我要开始的地方:

SELECT
    COALESCE(NULLIF(SalesMan, ''), NULLIF(SalesMan2, '')),
    SUM(CASE WHEN COALESCE(SalesMan, '') <> '' THEN 1.0 ELSE 0.0 END) +
        SUM(CASE WHEN COALESCE(SalesMan2, '') <> '' THEN 0.5 ELSE 0.0 END) AS SalesCount
FROM Customers C1
FULL OUTER JOIN Customers C2 ON
    C2.SalesMan = C1.SalesMan2 AND
    C2.Status = 'SOLD' AND
    C2.SaleDate BETWEEN @BeginDate AND @EndDate
WHERE
    C1.Status = 'SOLD' AND
    C1.SaleDate BETWEEN @BeginDate AND @EndDate
GROUP BY
    COALESCE(NULLIF(SalesMan, ''), NULLIF(SalesMan2, ''))

这是未经测试的,因为您没有包含设置测试场景的代码,所以不在我的脑海中。如果结果不正确,请告诉我。

一种方法使用 union all:

SELECT SalesMan, SUM(cnt) AS SalesCount 
FROM  ((select c.SalesMan, 1 as cnt
        FROM Customers c
        WHERE SaleDate Between @BeginDate And @EndDate AND Status = 'SOLD' 
       ) UNION ALL
      (SELECT SalesMan2, 0.5 as cnt
       FROM Customers c
       WHERE SaleDate Between @BeginDate And @EndDate AND Status = 'SOLD'
      )
     ) c
GROUP BY SalesMan;

非常感谢您的帮助。我尝试了两种解决方案,Gordon 的解决方案开箱即用。

运行的程序如下

SELECT SalesMan, SUM(cnt) AS SalesCount 
FROM  ((select c.SalesMan, 1 as cnt
FROM Customers c
    WHERE SaleDate Between @BeginDate And @EndDate AND Status = 'SOLD' 
   ) UNION ALL
  (SELECT SalesMan2, 0.5 as cnt
   FROM Customers c
   WHERE SaleDate Between @BeginDate And @EndDate AND Status = 'SOLD' AND 
   SalesMan2 <> ''
  )
 ) c
GROUP BY SalesMan ORDER BY SalesCount DESC ;   

我添加了 AND SalesMan2 <> '' And Order By 子句,效果很好。

我也在使用 MSSQL。以后我会记得post。