powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY
16 сообщений из 16, страница 1 из 1
GROUP BY
    #32073668
Игорь Т.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача.
Есть таблица с аккаунтами
(
идентификатор(acc_id) - первичный,
имя аккаунта(acc_name)
)
и с платежами этих аккаунтов
(
идентификатор платежа(p_id) - первичный,
идентификатор аккаунта(acc_id) - внешний,
время платежа(p_date),
сумма(amount)
).
нужно сделать выборку вида:
(
имя аккаунта(acc_name),
время последнего платежа(p_date),
сумма(amount)
)

недолго думая, написал запрос:




SELECT max( trdate ) , acc_name, amount, accounts.acc_id
FROM paymenthistory, accounts
WHERE paymenthistory.acc_id = accounts.acc_id
GROUP BY paymenthistory.acc_id

так вот этот свинтус выкинул мне

Column 'accounts.Acc_Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
......
естественно, что после включения всех этих полей в блок GROUP BY, я не получу нужной выборки, потому как при группировке, например, по платежу, он группирует все еще и по уникальным плтежам, что, в принципе, нафиг мне не нужно. И не включить я не могу, как видимо. Как же правильно сделать такой запрос? P.S. Что интересно, в MySQL это запрос идет на ура. Собственно, именно благодаря своему MySQL-ному прошлому я и родил этот запрос

я уже разобрался как работает group by, но так и не родил способ получения нужных данных
...
Рейтинг: 0 / 0
GROUP BY
    #32073672
gdn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdn
Гость
Я сейчас подбираю себе помощника, и как раз такого плана задачу даю на собеседовании. Чего я только не увидал ((((((((((((((((. Начиная от юнионов и заканчивая курсорами, а решается все или через временную таблицу (при большом наборе данных оптимальнее), или через корелированный запрос.
...
Рейтинг: 0 / 0
GROUP BY
    #32073678
doctor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мож как то так, пишу прямо здесь, проверить неначем

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select t1.date, t1.acc_name, a.ammount, a.acc_id

(select date=max( trdate ) , p.acc_name ,  p.acc.id
from paymenthistory p inner join accounts a
on p.acc_id=a.acc.id 
group by p.acc_name, p.acc.id ) t1

inner join 

accounts a on a.trdate = t1.date and a.acc.id=t1.acc.id

...
Рейтинг: 0 / 0
GROUP BY
    #32073680
doctor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
acc.id -> acc_id
...
Рейтинг: 0 / 0
GROUP BY
    #32073719
Delphimaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HI, all

I don't think that you should use simple GROUP BY at all.

It works in your case only without acc_name:
SELECT max( trdate ) , amount, accounts.acc_id
FROM paymenthistory, accounts
WHERE paymenthistory.acc_id = accounts.acc_id
GROUP BY paymenthistory.acc_id

In your case should be:

SELECT a.acc_name, a.acc_id, p.amount, p.p_date
FROM accounts a
left outer join (select last=max(p_date), acc_id
from paymenthistory
group by acc_id) pm
on a.acc_id = pm.acc_id
left outer join paymenthistory p
on a.acc_id = p.acc_id and p.p_date = pm.last
order by a.acc_id

BR from Toronto.
...
Рейтинг: 0 / 0
GROUP BY
    #32073723
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
USE tempdb
GO
CREATE TABLE dbo.accounts (acc_id INTEGER IDENTITY( 1 , 1 ) PRIMARY KEY, acc_name VARCHAR( 100 ))
GO
CREATE TABLE dbo.paymenthistory (p_id INTEGER IDENTITY( 1 , 1 ) PRIMARY KEY, acc_id INTEGER REFERENCES dbo.accounts(acc_id), trdate datetime, amount money)
GO
INSERT dbo.accounts VALUES ('first')
INSERT dbo.accounts VALUES ('last')
INSERT dbo.paymenthistory VALUES ( 1 , '2002-01-01',  12 )
INSERT dbo.paymenthistory VALUES ( 1 , '2002-12-12',  31 )
INSERT dbo.paymenthistory VALUES ( 1 , '2002-12-12',  31 )
INSERT dbo.paymenthistory VALUES ( 2 , '2000-07-17',  7 )
GO

SELECT DISTINCT acc_name, trdate, amount
  FROM dbo.accounts a
 INNER JOIN dbo.paymenthistory p
    ON a.acc_id = p.acc_id
 WHERE p.trdate = (SELECT MAX(trdate) FROM dbo.paymenthistory p2 WHERE p2.acc_id = p.acc_id)
GO
...
Рейтинг: 0 / 0
GROUP BY
    #32073724
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей, нельзя ли syntax colouring дополнить и для USE, DISTINCT, REFERENCES, INTEGER, VARCHAR, MAX...?
...
Рейтинг: 0 / 0
GROUP BY
    #32073727
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр вообще-то. Правда по Alex и не поймешь.
А по поводу синтаксис - конечно можно. Было бы здорово если бы помогли составить список всех слов которые нужно подсвечивать.

Сейчас подсвечивается:

"select","where","min","from","group","order","sum","count","avg","or","and","by","create","drop","index", "procedure","trigger","alter","break","begin","end","asc","desc","delete","not","like","update", "insert","into","null","primary","key","foreign","default","table","values","constraint","join","fetch","exec","inner","outer","print","else","declare","if","exists","transaction", "tran","rollback","commit","return","raiserror","while","as","set","is","on","cursor","for","open","deallocate","left","right","next", "grant", "execute", "with", "case", "when", "go", "convert", "between", "identity", "output","openxml","goto"

Какие будут добавления?

Alex
...
Рейтинг: 0 / 0
GROUP BY
    #32073729
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите ради Бога - не усмотрел, позор...

По поводу слов - может включить все ключевые слова T-SQL (SQL Server 2000) для этого форума?
Причем в цветах QA желательно :)

GO не следует подсвечивать, IMHO.

Соответственно, "не хватает":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
ADD
EXCEPT
PERCENT
ALL
PLAN
PRECISION
ANY
EXIT
PROC
FILE
AUTHORIZATION
FILLFACTOR
PUBLIC
BACKUP
READ
FREETEXT
READTEXT
FREETEXTTABLE
RECONFIGURE
BROWSE
REFERENCES
BULK
FULL
REPLICATION
FUNCTION
RESTORE
CASCADE
RESTRICT
CHECK
REVOKE
CHECKPOINT
HAVING
CLOSE
HOLDLOCK
CLUSTERED
ROWCOUNT
COALESCE
IDENTITY_INSERT
ROWGUIDCOL
COLLATE
IDENTITYCOL
RULE
COLUMN
SAVE
IN
SCHEMA
COMPUTE
SESSION_USER
CONTAINS
CONTAINSTABLE
INTERSECT
SETUSER
CONTINUE
SHUTDOWN
SOME
STATISTICS
CROSS
SYSTEM_USER
CURRENT
KILL
CURRENT_DATE
TEXTSIZE
CURRENT_TIME
THEN
CURRENT_TIMESTAMP
LINENO
TO
CURRENT_USER
LOAD
TOP
NATIONAL
DATABASE
NOCHECK
DBCC
NONCLUSTERED
TRUNCATE
TSEQUAL
NULLIF
UNION
OF
UNIQUE
DENY
OFF
OFFSETS
UPDATETEXT
DISK
USE
DISTINCT
USER
DISTRIBUTED
OPENDATASOURCE
DOUBLE
OPENQUERY
VARYING
OPENROWSET
VIEW
DUMMY
WAITFOR
DUMP
OPTION
ERRLVL
ESCAPE
OVER
WRITETEXT
...
Рейтинг: 0 / 0
GROUP BY
    #32073730
Фотография judge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня часто путают когда я пишу Alex. :)
Хорошо, я эти слова добавлю.

Alex
...
Рейтинг: 0 / 0
GROUP BY
    #32073733
Delphimaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Small comments,

Be carefull with
"WHERE p.trdate = (SELECT MAX(trdate) FROM dbo.paymenthistory p2 WHERE p2.acc_id = p.acc_id)"
because will be no accounts in output recordet for accounts without payments.

BR.
...
Рейтинг: 0 / 0
GROUP BY
    #32073762
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Delphimaster:

Так вроде ж и не надо выводить Аккаунты по которым нет платежей?
...
Рейтинг: 0 / 0
GROUP BY
    #32073785
Осирис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, а вот так разве нельзя ?

select accounts.acc_name, max(p_date), sum(amount)
from accounts, payments
where accounts.acc_id = payments.acc_id
group by accounts.acc_name
...
Рейтинг: 0 / 0
GROUP BY
    #32073799
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Осирис: Так в том-то и дело что сумму надо только последнего платежа а не всех SUM()
...
Рейтинг: 0 / 0
GROUP BY
    #32073802
Asan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не пойму, а чем не подходит:

select a.acc_name, s.p_date,s.amount from accounts a, sales s where s.acc_id = a.acc_id and
s.p_date = (select max(s1.p_date) from sales s1 where s1.acc_id = s.acc_id)
...
Рейтинг: 0 / 0
GROUP BY
    #32073822
Осирис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если учесть, что один поставщик может в один день заплатить только один раз, то можно вот так:

select acc_name, t.*, amount from
(
select accounts.acc_id, max(p_date) as p_date
from accounts, payments
where accounts.acc_id = payments.acc_id
group by accounts.acc_id
) t , payments, accounts
where t.acc_id = payments.acc_id and t.p_date = payments.p_date and t.acc_id = accounts.acc_id
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]