Group by/Order by问题 MSSQL
Group by / Order by problems MSSQL
今年夏天我一直在为一家公司做一个项目,即使我即将毕业,我仍然是一个菜鸟,我一直 运行 处理 group by 和 order by 子句的问题。
我尝试的一切似乎都不起作用,这是我目前所拥有的(语法是 suuuuper 搞砸了分组依据/排序依据)
SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , COUNT(*) as "number" , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID
GROUP BY LOC.NAME
ORDER BY number
这就是计数,因为其他在线指南说我需要某种排序或计数来订购...这是原始的...
SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID
GROUP BY LOC.NAME
ORDER BY LOC.NAME
感谢您的帮助,非常感谢! :)
由于您是 SO 的新手,这里有一些可以帮助您入门的内容。欢迎,顺便说一句。
我真的会阅读 Gordon 和 Maciej 的评论,以及关于 JOINS 的后续文章。祝你学业顺利。
这只是为了在语法上对 MSSQL 正确,对您的 JOIN 有一些假设。这不一定是您要查找的结果。
SELECT DISTINCT
ACT.ROW_ID,
ACT.CREATED,
MEM.FIRST_NAME,
MEM.LAST_NAME,
LOC.NAME,
COUNT(*) as "number",
CAT.NAME,
SER.NAME,
EMP.FIRST_NAME,
EMP.LAST_NAME,
SER.DURATION,
ACT.CASH,
COS.NAME,
ACT.COMMENTS,
ACT.TIP
FROM
S_ACTIVITY ACT
INNER JOIN S_LOCATION LOC on ACT.LOCATION_ID = LOC.ROW_ID
INNER JOIN LOC. S_CATEGORY CAT ON ACT.CATEGORY_ID = CAT.ROW_ID
INNER JOIN S_EMPLOYEE EMP ON ACT.EMPLOYEE_ID = EMP.ROW_ID
INNER JOIN S_SERVICE SER ON ACT.SERVICE_ID = SER.ROW_ID
INNER JOIN S_COST_CODE COS ON ACT.COST_CODE_ID = COS.ROW_ID
INNER JOIN S_MEMBER MEM ON ACT.MEMBER_ID = MEM.ROW_ID
GROUP BY
--every column that isn't an aggreggate... i.e. everything except COUNT(*).
ACT.ROW_ID,
ACT.CREATED,
MEM.FIRST_NAME,
MEM.LAST_NAME,
LOC.NAME,
CAT.NAME,
SER.NAME,
EMP.FIRST_NAME,
EMP.LAST_NAME,
SER.DURATION,
ACT.CASH,
COS.NAME,
ACT.COMMENTS,
ACT.TIP
ORDER BY
--You can't use alias names in GROUP BY or ORDER BY clauses.
COUNT(*)
显式连接 - 使用它们,它们很棒。这是一个例子:
SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID
变成
SELECT DISTINCT ACT.ROW_ID, ACT.CREATED, MEM.FIRST_NAME, MEM.LAST_NAME, LOC.NAME,
CAT.NAME, SER.NAME, EMP.FIRST_NAME, EMP.LAST_NAME, SER.DURATION,
ACT.CASH, COS.NAME, ACT.COMMENTS, ACT.TIP
FROM S_ACTIVITY ACT
INNER JOIN S_LOCATION LOC ON ACT.LOCATION_ID = LOC.ROW_ID
INNER JOIN S_CATEGORY CAT ON ACT.CATEGORY_ID = CAT.ROW_ID
INNER JOIN S_EMPLOYEE EMP ON ACT.EMPLOYEE_ID = EMP.ROW_ID
INNER JOIN S_SERVICE SER ON ACT.SERVICE_ID = SER.ROW_ID
INNER JOIN S_COST_CODE COS ON ACT.COST_CODE_ID = COS.ROW_ID
INNER JOIN S_MEMBER MEM ON ACT.MEMBER_ID = MEM.ROW_ID
Distinct - Distinct 是一个 SELECT
修饰符。它将结果限制为不同的行,与使用 GROUP BY all_columns_here
相同。如果那是你的目标,那么完全删除你的 GROUP BY
就可以了(见上面的查询)。这就引出了最后一点……
Group By/Order By - 您可以使用 GROUP BY
或 ORDER BY
,或同时使用两者。这些互不要求。此外,如果您有聚合,则 GROUP BY
仅被 SQL 要求,而 ORDER BY
仅对特定功能要求。否则你可以随意使用它们来满足你的项目需求。
今年夏天我一直在为一家公司做一个项目,即使我即将毕业,我仍然是一个菜鸟,我一直 运行 处理 group by 和 order by 子句的问题。
我尝试的一切似乎都不起作用,这是我目前所拥有的(语法是 suuuuper 搞砸了分组依据/排序依据)
SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , COUNT(*) as "number" , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID
GROUP BY LOC.NAME
ORDER BY number
这就是计数,因为其他在线指南说我需要某种排序或计数来订购...这是原始的...
SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID
GROUP BY LOC.NAME
ORDER BY LOC.NAME
感谢您的帮助,非常感谢! :)
由于您是 SO 的新手,这里有一些可以帮助您入门的内容。欢迎,顺便说一句。
我真的会阅读 Gordon 和 Maciej 的评论,以及关于 JOINS 的后续文章。祝你学业顺利。
这只是为了在语法上对 MSSQL 正确,对您的 JOIN 有一些假设。这不一定是您要查找的结果。
SELECT DISTINCT
ACT.ROW_ID,
ACT.CREATED,
MEM.FIRST_NAME,
MEM.LAST_NAME,
LOC.NAME,
COUNT(*) as "number",
CAT.NAME,
SER.NAME,
EMP.FIRST_NAME,
EMP.LAST_NAME,
SER.DURATION,
ACT.CASH,
COS.NAME,
ACT.COMMENTS,
ACT.TIP
FROM
S_ACTIVITY ACT
INNER JOIN S_LOCATION LOC on ACT.LOCATION_ID = LOC.ROW_ID
INNER JOIN LOC. S_CATEGORY CAT ON ACT.CATEGORY_ID = CAT.ROW_ID
INNER JOIN S_EMPLOYEE EMP ON ACT.EMPLOYEE_ID = EMP.ROW_ID
INNER JOIN S_SERVICE SER ON ACT.SERVICE_ID = SER.ROW_ID
INNER JOIN S_COST_CODE COS ON ACT.COST_CODE_ID = COS.ROW_ID
INNER JOIN S_MEMBER MEM ON ACT.MEMBER_ID = MEM.ROW_ID
GROUP BY
--every column that isn't an aggreggate... i.e. everything except COUNT(*).
ACT.ROW_ID,
ACT.CREATED,
MEM.FIRST_NAME,
MEM.LAST_NAME,
LOC.NAME,
CAT.NAME,
SER.NAME,
EMP.FIRST_NAME,
EMP.LAST_NAME,
SER.DURATION,
ACT.CASH,
COS.NAME,
ACT.COMMENTS,
ACT.TIP
ORDER BY
--You can't use alias names in GROUP BY or ORDER BY clauses.
COUNT(*)
显式连接 - 使用它们,它们很棒。这是一个例子:
SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID
变成
SELECT DISTINCT ACT.ROW_ID, ACT.CREATED, MEM.FIRST_NAME, MEM.LAST_NAME, LOC.NAME,
CAT.NAME, SER.NAME, EMP.FIRST_NAME, EMP.LAST_NAME, SER.DURATION,
ACT.CASH, COS.NAME, ACT.COMMENTS, ACT.TIP
FROM S_ACTIVITY ACT
INNER JOIN S_LOCATION LOC ON ACT.LOCATION_ID = LOC.ROW_ID
INNER JOIN S_CATEGORY CAT ON ACT.CATEGORY_ID = CAT.ROW_ID
INNER JOIN S_EMPLOYEE EMP ON ACT.EMPLOYEE_ID = EMP.ROW_ID
INNER JOIN S_SERVICE SER ON ACT.SERVICE_ID = SER.ROW_ID
INNER JOIN S_COST_CODE COS ON ACT.COST_CODE_ID = COS.ROW_ID
INNER JOIN S_MEMBER MEM ON ACT.MEMBER_ID = MEM.ROW_ID
Distinct - Distinct 是一个 SELECT
修饰符。它将结果限制为不同的行,与使用 GROUP BY all_columns_here
相同。如果那是你的目标,那么完全删除你的 GROUP BY
就可以了(见上面的查询)。这就引出了最后一点……
Group By/Order By - 您可以使用 GROUP BY
或 ORDER BY
,或同时使用两者。这些互不要求。此外,如果您有聚合,则 GROUP BY
仅被 SQL 要求,而 ORDER BY
仅对特定功能要求。否则你可以随意使用它们来满足你的项目需求。