条件计数 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。
我看过这些示例,我认为我应该使用 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。