Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY / 16 сообщений из 16, страница 1 из 1
28.11.2002, 19:06:51
    #32073668
Игорь Т.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Задача.
Есть таблица с аккаунтами
(
идентификатор(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
28.11.2002, 19:15:19
    #32073672
gdn
gdn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Я сейчас подбираю себе помощника, и как раз такого плана задачу даю на собеседовании. Чего я только не увидал ((((((((((((((((. Начиная от юнионов и заканчивая курсорами, а решается все или через временную таблицу (при большом наборе данных оптимальнее), или через корелированный запрос.
...
Рейтинг: 0 / 0
28.11.2002, 19:27:27
    #32073678
doctor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Мож как то так, пишу прямо здесь, проверить неначем

Код:
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
28.11.2002, 19:28:58
    #32073680
doctor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
acc.id -> acc_id
...
Рейтинг: 0 / 0
28.11.2002, 23:36:22
    #32073719
Delphimaster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
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
29.11.2002, 00:24:25
    #32073723
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Код: 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
29.11.2002, 00:28:06
    #32073724
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Алексей, нельзя ли syntax colouring дополнить и для USE, DISTINCT, REFERENCES, INTEGER, VARCHAR, MAX...?
...
Рейтинг: 0 / 0
29.11.2002, 00:42:54
    #32073727
judge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Александр вообще-то. Правда по 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
29.11.2002, 01:23:15
    #32073729
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Простите ради Бога - не усмотрел, позор...

По поводу слов - может включить все ключевые слова 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
29.11.2002, 01:29:35
    #32073730
judge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Меня часто путают когда я пишу Alex. :)
Хорошо, я эти слова добавлю.

Alex
...
Рейтинг: 0 / 0
29.11.2002, 01:46:50
    #32073733
Delphimaster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
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
29.11.2002, 08:55:15
    #32073762
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
2Delphimaster:

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

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
29.11.2002, 09:52:52
    #32073799
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
2Осирис: Так в том-то и дело что сумму надо только последнего платежа а не всех SUM()
...
Рейтинг: 0 / 0
29.11.2002, 09:56:56
    #32073802
Asan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Я не пойму, а чем не подходит:

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
29.11.2002, 10:12:13
    #32073822
Осирис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY
Если учесть, что один поставщик может в один день заплатить только один раз, то можно вот так:

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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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