Mysql 不带WHERE语句的整数比较
我正在尝试编写一个MySQL语句,它将返回以下结果:Mysql 不带WHERE语句的整数比较,mysql,sql,select,group-by,pivot,Mysql,Sql,Select,Group By,Pivot,我正在尝试编写一个MySQL语句,它将返回以下结果: ## Name | Day 0 | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 | ##Jeff | 0 | 3 | 1 | 2 | 1 | 1 | ##Larry | 1 | 1 | 4 | 4 | 1 | 0 | 基于每个员工每天执行的任务数量 我的数据库表如下所示: 员工 id(INT)、number(VA
## Name | Day 0 | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 |
##Jeff | 0 | 3 | 1 | 2 | 1 | 1 |
##Larry | 1 | 1 | 4 | 4 | 1 | 0 |
基于每个员工每天执行的任务数量
我的数据库表如下所示:
员工
id
(INT)、number
(VARCHAR)、name
(VARCHAR)、datestart
(VARCHAR)
项目
id
(INT)、number
(VARCHAR)、dateend
(DATETIME)
现在我用的是这样一句话:
SELECT
a.name AS "Name",
count(abs(datediff(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded))) AS "Day 0",
count(abs(datediff(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded))) AS "Day 1",
count(abs(datediff(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded))) AS "Day 2",
count(abs(datediff(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded))) AS "Day 3",
count(abs(datediff(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded))) AS "Day 4",
count(abs(datediff(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded))) AS "Day 5"
FROM employee a, project b
WHERE b.number=a.number
AND "Day 0" = 0
AND "Day 1" = 1
AND "Day 2" = 2
AND "Day 3" = 3
AND "Day 4" = 4
AND "Day 5" >= 5
电流输出
上述声明有效,但由于某些原因,它不能提供上述要求中提到的预期结果。关于如何修复/更改它,有什么想法吗
编辑
如果我取出:
AND "Day 0" = 0
AND "Day 1" = 1
AND "Day 2" = 2
AND "Day 3" = 3
AND "Day 4" = 4
AND "Day 5" >= 5
然后打印出:
## Name | Day 0 | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 |
##Jeff | 9 | 9 | 9 | 9 | 9 | 9 |
试试这个:
SELECT
emp.name AS '## Name',
(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 0
) AS 'Day 0'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 1
) AS 'Day 1'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 2
) AS 'Day 2'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 3
) AS 'Day 3'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 4
) AS 'Day 4'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) >= 5
) AS 'Day 5'
FROM employee emp
GROUP BY emp.name
请参阅(根据提供的信息对您的数据进行了一些假设)。尝试以下方法:
SELECT
emp.name AS '## Name',
(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 0
) AS 'Day 0'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 1
) AS 'Day 1'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 2
) AS 'Day 2'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 3
) AS 'Day 3'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 4
) AS 'Day 4'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) >= 5
) AS 'Day 5'
FROM employee emp
GROUP BY emp.name
请参阅(根据提供的信息对您的数据进行了一些假设)。尝试以下方法:
SELECT
emp.name AS '## Name',
(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 0
) AS 'Day 0'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 1
) AS 'Day 1'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 2
) AS 'Day 2'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 3
) AS 'Day 3'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 4
) AS 'Day 4'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) >= 5
) AS 'Day 5'
FROM employee emp
GROUP BY emp.name
请参阅(根据提供的信息对您的数据进行了一些假设)。尝试以下方法:
SELECT
emp.name AS '## Name',
(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 0
) AS 'Day 0'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 1
) AS 'Day 1'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 2
) AS 'Day 2'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 3
) AS 'Day 3'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) = 4
) AS 'Day 4'
,(SELECT COUNT(*)
FROM project p JOIN employee e ON p.number = e.number
WHERE e.name = emp.name
AND datediff(str_to_date(p.dateEnded, '%Y-%m-%d'), e.dateStarted) >= 5
) AS 'Day 5'
FROM employee emp
GROUP BY emp.name
请参阅(根据提供的信息对您的数据进行了一些假设)。尝试以下方法:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
可以通过执行以下join语句或where来改进以前的解决方案 确保项目上有索引(唯一?)(编号、日期结束) 您还可以尝试添加员工索引(编号、日期开始) 空值通常不是任何索引的一部分(因为它们是空的),您可以尝试将该字段的默认值更新为“0000-00-00”,这样它将被索引,并可能增加速度 试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
可以通过执行以下join语句或where来改进以前的解决方案 确保项目上有索引(唯一?)(编号、日期结束) 您还可以尝试添加员工索引(编号、日期开始) 空值通常不是任何索引的一部分(因为它们是空的),您可以尝试将该字段的默认值更新为“0000-00-00”,这样它将被索引,并可能增加速度 试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
可以通过执行以下join语句或where来改进以前的解决方案 确保项目上有索引(唯一?)(编号、日期结束) 您还可以尝试添加员工索引(编号、日期开始) 空值通常不是任何索引的一部分(因为它们是空的),您可以尝试将该字段的默认值更新为“0000-00-00”,这样它将被索引,并可能增加速度 试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
可以通过执行以下join语句或where来改进以前的解决方案 确保项目上有索引(唯一?)(编号、日期结束) 您还可以尝试添加员工索引(编号、日期开始) 空值通常不是任何索引的一部分(因为它们是空的),您可以尝试将该字段的默认值更新为“0000-00-00”,这样它将被索引,并可能增加速度 试试这个:
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5",
COUNT(1) AS "Total Days"
FROM (SELECT a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON b.number = a.number
WHERE b.dateEnded IS NOT NULL
) AS A
GROUP BY a.name;
SELECT a.name AS "Name",
SUM(noOfDays = 0) AS "Day 0", SUM(noOfDays = 1) AS "Day 1",
SUM(noOfDays = 2) AS "Day 2", SUM(noOfDays = 3) AS "Day 3",
SUM(noOfDays = 4) AS "Day 4", SUM(noOfDays >= 5) AS "Day 5"
FROM (SELECT a.number, a.name, DATEDIFF(DATE(b.dateEnded), DATE(a.dateStarted)) noOfDays
FROM employee a INNER JOIN project b ON (b.number = a.number and b.dateEnded>a.dateStarted)
) AS a
GROUP BY a.name
检查
使用前面一个答案中的SQL FIDLE数据,我尝试了以下方法:-
SELECT Sub0.name AS "Name",
SUM(IF(DayDesc = 0 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 0",
SUM(IF(DayDesc = 1 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 1",
SUM(IF(DayDesc = 2 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 2",
SUM(IF(DayDesc = 3 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 3",
SUM(IF(DayDesc = 4 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 4",
SUM(IF(DayDesc = 5 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 5"
FROM
(
SELECT DISTINCT name FROM employee
)Sub0
CROSS JOIN
(
SELECT 0 AS DayMin, 0 AS DayMax, 0 AS DayDesc
UNION
SELECT 1 AS DayMin, 1 AS DayMax, 1 AS DayDesc
UNION
SELECT 2 AS DayMin, 2 AS DayMax, 2 AS DayDesc
UNION
SELECT 3 AS DayMin, 3 AS DayMax, 3 AS DayDesc
UNION
SELECT 4 AS DayMin, 4 AS DayMax, 4 AS DayDesc
UNION
SELECT 5 AS DayMin, 999999999 AS DayMax, 5 AS DayDesc
) Sub1
LEFT OUTER JOIN
(
SELECT a.name, ABS(DATEDIFF(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded)) DaysCount
FROM employee a
INNER JOIN project b
ON b.number = a.number
) Sub2
ON Sub2.DaysCount BETWEEN Sub1.DayMin AND Sub1.DayMax
AND Sub2.name = Sub0.name
GROUP BY Sub0.name
似乎给出了正确的结果,而且速度相当快
SQL fiddle在此:-
效率更高一点(但不能处理没有项目的员工):-
SQL fiddle在此:-
使用前面一个答案中的SQL FIDLE数据,我尝试了以下方法:-
SELECT Sub0.name AS "Name",
SUM(IF(DayDesc = 0 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 0",
SUM(IF(DayDesc = 1 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 1",
SUM(IF(DayDesc = 2 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 2",
SUM(IF(DayDesc = 3 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 3",
SUM(IF(DayDesc = 4 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 4",
SUM(IF(DayDesc = 5 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 5"
FROM
(
SELECT DISTINCT name FROM employee
)Sub0
CROSS JOIN
(
SELECT 0 AS DayMin, 0 AS DayMax, 0 AS DayDesc
UNION
SELECT 1 AS DayMin, 1 AS DayMax, 1 AS DayDesc
UNION
SELECT 2 AS DayMin, 2 AS DayMax, 2 AS DayDesc
UNION
SELECT 3 AS DayMin, 3 AS DayMax, 3 AS DayDesc
UNION
SELECT 4 AS DayMin, 4 AS DayMax, 4 AS DayDesc
UNION
SELECT 5 AS DayMin, 999999999 AS DayMax, 5 AS DayDesc
) Sub1
LEFT OUTER JOIN
(
SELECT a.name, ABS(DATEDIFF(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded)) DaysCount
FROM employee a
INNER JOIN project b
ON b.number = a.number
) Sub2
ON Sub2.DaysCount BETWEEN Sub1.DayMin AND Sub1.DayMax
AND Sub2.name = Sub0.name
GROUP BY Sub0.name
似乎给出了正确的结果,而且速度相当快
SQL fiddle在此:-
效率更高一点(但不能处理没有项目的员工):-
SQL fiddle在此:-
使用前面一个答案中的SQL FIDLE数据,我尝试了以下方法:-
SELECT Sub0.name AS "Name",
SUM(IF(DayDesc = 0 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 0",
SUM(IF(DayDesc = 1 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 1",
SUM(IF(DayDesc = 2 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 2",
SUM(IF(DayDesc = 3 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 3",
SUM(IF(DayDesc = 4 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 4",
SUM(IF(DayDesc = 5 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 5"
FROM
(
SELECT DISTINCT name FROM employee
)Sub0
CROSS JOIN
(
SELECT 0 AS DayMin, 0 AS DayMax, 0 AS DayDesc
UNION
SELECT 1 AS DayMin, 1 AS DayMax, 1 AS DayDesc
UNION
SELECT 2 AS DayMin, 2 AS DayMax, 2 AS DayDesc
UNION
SELECT 3 AS DayMin, 3 AS DayMax, 3 AS DayDesc
UNION
SELECT 4 AS DayMin, 4 AS DayMax, 4 AS DayDesc
UNION
SELECT 5 AS DayMin, 999999999 AS DayMax, 5 AS DayDesc
) Sub1
LEFT OUTER JOIN
(
SELECT a.name, ABS(DATEDIFF(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded)) DaysCount
FROM employee a
INNER JOIN project b
ON b.number = a.number
) Sub2
ON Sub2.DaysCount BETWEEN Sub1.DayMin AND Sub1.DayMax
AND Sub2.name = Sub0.name
GROUP BY Sub0.name
似乎给出了正确的结果,而且速度相当快
SQL fiddle在此:-
效率更高一点(但不能处理没有项目的员工):-
SQL fiddle在此:-
使用前面一个答案中的SQL FIDLE数据,我尝试了以下方法:-
SELECT Sub0.name AS "Name",
SUM(IF(DayDesc = 0 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 0",
SUM(IF(DayDesc = 1 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 1",
SUM(IF(DayDesc = 2 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 2",
SUM(IF(DayDesc = 3 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 3",
SUM(IF(DayDesc = 4 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 4",
SUM(IF(DayDesc = 5 AND DaysCount IS NOT NULL, 1, 0)) AS "Day 5"
FROM
(
SELECT DISTINCT name FROM employee
)Sub0
CROSS JOIN
(
SELECT 0 AS DayMin, 0 AS DayMax, 0 AS DayDesc
UNION
SELECT 1 AS DayMin, 1 AS DayMax, 1 AS DayDesc
UNION
SELECT 2 AS DayMin, 2 AS DayMax, 2 AS DayDesc
UNION
SELECT 3 AS DayMin, 3 AS DayMax, 3 AS DayDesc
UNION
SELECT 4 AS DayMin, 4 AS DayMax, 4 AS DayDesc
UNION
SELECT 5 AS DayMin, 999999999 AS DayMax, 5 AS DayDesc
) Sub1
LEFT OUTER JOIN
(
SELECT a.name, ABS(DATEDIFF(STR_TO_DATE(a.dateStarted, '%Y-%m-%d %H:%i:%s'), b.dateEnded)) DaysCount
FROM employee a
INNER JOIN project b
ON b.number = a.number
) Sub2
ON Sub2.DaysCount BETWEEN Sub1.DayMin AND Sub1.DayMax
AND Sub2.name = Sub0.name
GROUP BY Sub0.name
似乎给出了正确的结果,而且速度相当快
SQL fiddle在此:-
效率更高一点(但不能处理没有项目的员工):-
SQL fiddle在此:-
员工和项目之间没有连接条件?
STR\u TO\u日期(a.datestart,%Y-%m-%d%H:%i:%s)的意义是什么?你的日期是以字符串形式存储的吗?@hashbrown,如果这两个id是两个独立的东西(个人id,项目id),那么加入它们就没有意义了。如果它们确实引用了相同的东西(名称非常糟糕),那么您可以将它们合并到一个表中。@PhilPerry。这就是为什么我要问这两个表之间的关系/连接条件是什么?您如何知道哪个员工与哪个项目相关?仍在挣扎?考虑提供适当的DDL(和/或SqLoFIDLE)以及在<代码>雇员>代码>和<代码>项目< /代码>之间的连接结果条件吗?<代码> StruthtoSyd(A.DestestARTE,'%Y-%M%%D%H:%I:%S')< /C> >的意义是什么?你的日期是以字符串形式存储的吗?@hashbrown,如果这两个id是两个独立的东西(个人id,项目id),那么加入它们就没有意义了。如果它们确实引用了相同的东西(名称非常糟糕),那么您可以将它们合并到一个表中。@PhilPerry。这就是为什么我要问这两个表之间的关系/连接条件是什么?您如何知道哪个员工与哪个项目相关?仍在挣扎?考虑提供适当的DDL(和/或SqLFIDLE),连同期望的结果,在<代码>雇员< /代码>和<代码>项目< /代码>之间的连接条件?“代码> Struthtox日期的意义是什么?(A.DAT)