SQL Simple Group Викликаючи розділи дублікатів

У мене є запит SQL, який викликає мене проблеми. SQL, який я поки що, є наступним:

SELECT Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY Dated, [Level 1 reason]

Тепер проблема, яку я маю, полягає в тому, що результати містять кілька причин, а не групуються разом, як мені потрібно. Прикладом результатів проблеми є наступне:

1/2/2013 10:02:00 AM    Westport    2
1/2/2013 10:17:00 AM    Westport    9
1/2/2013 10:48:00 AM    Engineering 5
1/2/2013 11:01:00 AM    Facilities  6

Призначений результат полягає в тому, що для однієї дати існує одна група Westport. Запит також потребує обробки кількох дат, але вони не були включені в фрагмент для читання.

Дякую за будь-яку допомогу. Я знаю, що це проста причина, але я не можу зрозуміти це.

** EDIT IN: вибачте, я виконую це в Access. Видалення групи за даними призводить до помилки в Access. Я не знаю, що робити з цього

"Ви намагалися витягти запит, який не містить зазначеного   вираз "Даний як частина сукупної функції" **.

Д Стенлі вирішив моє запитання з наступним запитом

SELECT DateValue(Dated) AS Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
0
Вам потрібно видалити час із стовпця "Даті".
додано Автор Ondrej Svejdar, джерело
Якщо ви групуєте за датою, ви отримаєте рядок для кожного значення від дати. Це цілком нормально.
додано Автор xlecoustillier, джерело
Якщо ви групуєте за датою, ви отримаєте рядок для кожного значення від дати. Це цілком нормально.
додано Автор xlecoustillier, джерело
Що таке система бази даних? SQL Server? MySQL? Oracle? Щось ще? Сам тег sql просто виражає стандартну мову, але функції маніпулювання датами не схильні дотримуватися стандарту.
додано Автор Damien_The_Unbeliever, джерело
Вибачте за це, я роблю цей запит у Access.
додано Автор Duffie, джерело
Видалення даних Dated в повідомленні про помилку в Access "Ви намагалися витягти запит, який не включає в себе зазначене вираз" Dated as part of a aggregate function ".
додано Автор Duffie, джерело
Видалення даних Dated в повідомленні про помилку в Access "Ви намагалися витягти запит, який не включає в себе зазначене вираз" Dated as part of a aggregate function ".
додано Автор Duffie, джерело

6 Відповіді

У Access ви використовуєте DateValue , щоб видалити час із стовпця дати:

SELECT DateValue(Dated) Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
2
додано
Дякую! Це закінчилося роботою досконало. Я не усвідомлював, що частина часу datetime викликала проблему.
додано Автор Duffie, джерело

У Access ви використовуєте DateValue , щоб видалити час із стовпця дати:

SELECT DateValue(Dated) Dated, [Level 1 reason], SUM(Duration) AS Mins
FROM Downtime
GROUP BY DateValue(Dated), [Level 1 reason]
2
додано
Дякую! Це закінчилося роботою досконало. Я не усвідомлював, що частина часу datetime викликала проблему.
додано Автор Duffie, джерело

Я думаю, у доступі це було б:

SELECT CDate(Int(Dated)) , [Level 1 reason],
   SUM(Duration) AS Mins
FROM Downtime
GROUP BY CDate(Int(Dated)) , [Level 1 reason];
0
додано

Я думаю, у доступі це було б:

SELECT CDate(Int(Dated)) , [Level 1 reason],
   SUM(Duration) AS Mins
FROM Downtime
GROUP BY CDate(Int(Dated)) , [Level 1 reason];
0
додано

Схоже, ви хочете видалити компонент часу. Як це зробити, залежить від систем бази даних. У SQL Server це буде:

SELECT DATEADD(day,DATEDIFF(day,0,Dated),0), [Level 1 reason],
       SUM(Duration) AS Mins
FROM Downtime
GROUP BY DATEADD(day,DATEDIFF(day,0,Dated),0), [Level 1 reason]

Це працює тому, що 0 можна безперервно перетворити на дату (01.01.1900 в опівночі), а DATEADD та DATEDIFF працює лише в невід'ємних частинах частини дати (тут, day ). Отже, це "скільки повних днів сталося з 01.01.1900 в опівночі?" і "Додамо таку саму кількість днів до 1 січня 1900 року в опівночі" - що дає нам ту ж дату, що й вартість, з якої ми почали, але завжди в опівночі.


Для доступу, я думаю, ви повинні вказати датупартії ( day стає "d" ). Я не впевнений, що приховане перетворення 0 все ще працює, але ви можете просто замінити будь-яку постійну дату на всіх місцях, якими я використав вище 0 , наприклад:

SELECT DATEADD("d",DATEDIFF("d","01/01/1900",Dated),"01/01/1900"),
       [Level 1 reason],
       SUM(Duration) AS Mins
FROM Downtime
GROUP BY DATEADD("d",DATEDIFF("d","01/01/1900",Dated),"01/01/1900"),
         [Level 1 reason]
0
додано

Схоже, ви хочете видалити компонент часу. Як це зробити, залежить від систем бази даних. У SQL Server це буде:

SELECT DATEADD(day,DATEDIFF(day,0,Dated),0), [Level 1 reason],
       SUM(Duration) AS Mins
FROM Downtime
GROUP BY DATEADD(day,DATEDIFF(day,0,Dated),0), [Level 1 reason]

Це працює тому, що 0 можна безперервно перетворити на дату (01.01.1900 в опівночі), а DATEADD та DATEDIFF працює лише в невід'ємних частинах частини дати (тут, day ). Отже, це "скільки повних днів сталося з 01.01.1900 в опівночі?" і "Додамо таку саму кількість днів до 1 січня 1900 року в опівночі" - що дає нам ту ж дату, що й вартість, з якої ми почали, але завжди в опівночі.


Для доступу, я думаю, ви повинні вказати датупартії ( day стає "d" ). Я не впевнений, що приховане перетворення 0 все ще працює, але ви можете просто замінити будь-яку постійну дату на всіх місцях, якими я використав вище 0 , наприклад:

SELECT DATEADD("d",DATEDIFF("d","01/01/1900",Dated),"01/01/1900"),
       [Level 1 reason],
       SUM(Duration) AS Mins
FROM Downtime
GROUP BY DATEADD("d",DATEDIFF("d","01/01/1900",Dated),"01/01/1900"),
         [Level 1 reason]
0
додано