【问题标题】:Group by / Order by problems MSSQLGroup by / Order by 问题 MSSQL
【发布时间】:2016-07-13 21:08:42
【问题描述】:

今年夏天我一直在为一家公司做一个项目,即使我即将读研究生,我仍然是个菜鸟,我一直在处理 group by 和 order by 条款时遇到问题。

我尝试的任何方法似乎都不起作用,这是我到目前为止所拥有的(语法是 suuuuper 搞砸了 group by / order by)

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

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

【问题讨论】:

  • (1) 我删除了无关的数据库标签。随意添加回您真正使用的数据库的标签。 (2) 学习使用明确、正确的JOIN 语法。 FROM 子句中的逗号很难阅读。
  • 我强烈建议您阅读以下内容:Visual Representation of SQL Joins
  • 这些查询的 GROUP BYORDER BY 子句没有明显的问题。

标签: sql group-by sql-order-by


【解决方案1】:

显式连接 - 使用它们,它们很棒。这是一个例子:

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 BYORDER BY,或同时使用两者。这些不需要彼此。另外,GROUP BY 只有在你有聚合的情况下才被 SQL 需要,ORDER BY 只有特定的功能才需要。否则,您可以随意使用它们来满足您的项目要求。

【讨论】:

  • 感谢您的帮助,仍然对订购的内容进行了一些调整,但我认为我的逻辑有些错误,感谢所有 cmets!
【解决方案2】:

由于您是 SO 新手,因此这里有一些可以帮助您入门的内容。欢迎,顺便说一句。

我真的会阅读 Gordon 和 Maciej 的 cmets,以及关于 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(*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2011-06-28
    • 2019-01-27
    • 2017-02-06
    • 2013-01-24
    相关资源
    最近更新 更多