2016-07-13 60 views
0

我今年夏天一直在为一家公司开发一个项目,即使在即将毕业的学校,我仍然非常喜欢noob,但我一直遇到与分组相关的问题和按子句排序的问题。按问题分组排序MSSQL

没有我尝试似乎工作,继承人是我迄今为止

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 

那与统计网上其他导游在说我(的语法suuuuper由/订单一塌糊涂组)需要一些排序或计数的订单...继承人原来...

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 

感谢您的帮助,非常感谢! :)

+2

(1)我删除了无关的数据库标记。随意为您真正使用的数据库添加标签。 (2)学习使用明确的,适当的'JOIN'语法。 FROM子句中的逗号很难阅读。 –

+0

我强烈建议阅读以下内容:[SQL加入的可视化表示](http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins) –

+0

没有什么明显的错误这些查询的“GROUP BY”和“ORDER BY”子句。 – Uueerdo

回答

0

明确连接 - 使用它们,他们都是伟大的。下面是一个例子:

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 

鲜明 - 鲜明是SELECT改性剂。它将结果限制为不同的行,并且与使用GROUP BY all_columns_here相同。如果这是你的目标,那么完全删除你的GROUP BY,你很好去(见上面的查询)。您可以使用一个GROUP BYORDER BY,或两者 - 这导致了最后一点...

集团通过/顺序按。这些不需要对方。另外,如果您有一个聚合,则只有SQL需要GROUP BY,并且只有特定功能需要ORDER BY。否则,您可以随意使用它们来满足您的项目需求。

+0

感谢您的帮助,仍然对订购内容做了一些调整,但是我想我已经了解了一些逻辑,感谢所有的评论! – Rolthar

0

这是让你开始,因为你是新来的SO。欢迎,BTW。

我真的会读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(*)