2016-07-13 6 views
0

Ive работало над проектом для компании этим летом, все еще очень много, даже для выпускников школы, я все время сталкиваюсь с проблемами, связанными с группой и заказами по статьям.Group by/Order by problems MSSQL

Ничего я стараюсь не кажется, работает, Вот что я до сих пор (синтаксис 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 

Thats с графом, как и другими гидами в Интернете говорил я нужен какой-то подсчет для заказа ... Heres the original ...

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 

Distinct - Distinct является SELECT модификатора. Он ограничивает результаты отдельными строками и аналогичен использованию GROUP BY all_columns_here. Если это ваша цель, то полностью удалите GROUP BY, и вам хорошо идти (см. Выше запрос). Это приводит к последней точке ...

Group By/Order By - Вы можете использовать либо GROUP BY или ORDER BY, или обоих. Они не требуют друг друга. Кроме того, GROUP BY требуется только SQL, если у вас есть агрегат, и ORDER BY требуется только для определенных функций. В противном случае вы можете использовать их по своему усмотрению для удовлетворения ваших требований к проекту.

+0

Спасибо за вашу помощь, по-прежнему немного подкорректированы с тем, что нужно заказать, но я думаю, что у меня есть часть логики, спасибо всем за комментарии! – Rolthar

0

Здесь вы можете начать работу с тех пор, как вы новичок в SO. Добро пожаловать, BTW.

Я действительно читал комментарии Гордона и Мачейя, а также статью о 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(*) 
Смежные вопросы