|
|
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Задача. Есть таблица с аккаунтами ( идентификатор(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, но так и не родил способ получения нужных данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 19:06:51 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Я сейчас подбираю себе помощника, и как раз такого плана задачу даю на собеседовании. Чего я только не увидал ((((((((((((((((. Начиная от юнионов и заканчивая курсорами, а решается все или через временную таблицу (при большом наборе данных оптимальнее), или через корелированный запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 19:15:19 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Мож как то так, пишу прямо здесь, проверить неначем Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 19:27:27 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 23:36:22 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 00:24:25 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Алексей, нельзя ли syntax colouring дополнить и для USE, DISTINCT, REFERENCES, INTEGER, VARCHAR, MAX...? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 00:28:06 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Александр вообще-то. Правда по 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 00:42:54 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Простите ради Бога - не усмотрел, позор... По поводу слов - может включить все ключевые слова 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 01:23:15 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Меня часто путают когда я пишу Alex. :) Хорошо, я эти слова добавлю. Alex ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 01:29:35 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 01:46:50 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
2Delphimaster: Так вроде ж и не надо выводить Аккаунты по которым нет платежей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 08:55:15 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Ребят, а вот так разве нельзя ? select accounts.acc_name, max(p_date), sum(amount) from accounts, payments where accounts.acc_id = payments.acc_id group by accounts.acc_name ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 09:41:00 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
2Осирис: Так в том-то и дело что сумму надо только последнего платежа а не всех SUM() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 09:52:52 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Я не пойму, а чем не подходит: 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 09:56:56 |
|
||
|
GROUP BY
|
|||
|---|---|---|---|
|
#18+
Если учесть, что один поставщик может в один день заплатить только один раз, то можно вот так: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2002, 10:12:13 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32073672&tid=1818424]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
45ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 354ms |

| 0 / 0 |
