Har följande kod som kodsnickrarn föreslog med minimala ändringar som jag gjort. Funkar fint:
Select MY_OFFICE_ID as OFID, PUSHSTAT_DATE AS THE_DATE, SUM(TRANSACTIONCNT) as Total_Count, REQUIRED.REQ_TOTAL as OFID_Total
FROM CAM_PUSH_STATISTICSTB
INNER Join
(SELECT MY_OFFICE_ID, SUM(CAST(TRANSACTIONCNT as BIGINT))
FROM CAM_PUSH_STATISTICSTB
WHERE pushstat_date >= '02-Aug-2016'
GROUP BY MY_OFFICE_ID)
AS REQUIRED(REQ_OFFICE_ID, REQ_TOTAL) ON MY_OFFICE_ID=REQUIRED.REQ_OFFICE_ID WHERE REQUIRED.REQ_TOTAL >= 18000
AND pushstat_date >= '02-Aug-2016'
GROUP by REQUIRED.REQ_TOTAL, MY_OFFICE_ID, PUSHSTAT_DATE
ORDER by REQUIRED.REQ_TOTAL desc, MY_OFFICE_ID, PUSHSTAT_DATE;
where delen 'WHERE REQUIRED.REQ_TOTAL >= 18000' säkrar att jag endast får in grupper vars totalsumma överstiger eller är lika med 18000 transaktioner.
Jag vill gärna lägga till ett villkor så jag bara får grupper som (förutom where delen ovan) också innehåller minst 3 records.
Jag illustrerar:
(1) Stockholm 03Mar16 5000
(2) Stockholm 04Mar16 13000
Stockholmgruppen exkluderas (den uppfyller bara kravet 'REQUIRED.REQ_TOTAL >= 18000' men inte minst 3 records) medan Kirunagruppen inkluderas då den uppfyller båda kraven.
Har följande kod som kodsnickrarn föreslog med minimala ändringar som jag gjort. Funkar fint:
Select MY_OFFICE_ID as OFID, PUSHSTAT_DATE AS THE_DATE, SUM(TRANSACTIONCNT) as Total_Count, REQUIRED.REQ_TOTAL as OFID_Total
FROM CAM_PUSH_STATISTICSTB
INNER Join
(SELECT MY_OFFICE_ID, SUM(CAST(TRANSACTIONCNT as BIGINT))
FROM CAM_PUSH_STATISTICSTB
WHERE pushstat_date >= '02-Aug-2016'
GROUP BY MY_OFFICE_ID)
AS REQUIRED(REQ_OFFICE_ID, REQ_TOTAL) ON MY_OFFICE_ID=REQUIRED.REQ_OFFICE_ID WHERE REQUIRED.REQ_TOTAL >= 18000
AND pushstat_date >= '02-Aug-2016'
GROUP by REQUIRED.REQ_TOTAL, MY_OFFICE_ID, PUSHSTAT_DATE
ORDER by REQUIRED.REQ_TOTAL desc, MY_OFFICE_ID, PUSHSTAT_DATE;
where delen 'WHERE REQUIRED.REQ_TOTAL >= 18000' säkrar att jag endast får in grupper vars totalsumma överstiger eller är lika med 18000 transaktioner.
Jag vill gärna lägga till ett villkor så jag bara får grupper som (förutom where delen ovan) också innehåller minst 3 records.
Jag illustrerar:
(1) Stockholm 03Mar16 5000
(2) Stockholm 04Mar16 13000
Stockholmgruppen exkluderas (den uppfyller bara kravet 'REQUIRED.REQ_TOTAL >= 18000' men inte minst 3 records) medan Kirunagruppen inkluderas då den uppfyller båda kraven.
Utnyttjar äggsperternas kunskap igen med denna statement som fungerar fint men som jag vill utöka:
Select THIS_OFFICE_ID as OFID_PCC_NR, PUSHSTAT_DATE AS THE_DATE,
SUM(TRANSACTION_CNT) as Total_Count, REQUIRED.REQ_TOTAL as OFID_PCC_Total FROM CAM_PUSH_STATISTICSTB
INNER JOIN
(SELECT THIS_OFFICE_ID, SUM(CAST(TRANSACTION_CNT as BIGINT)) FROM CAM_PUSH_STATISTICSTB
WHERE pushstat_date BETWEEN '3/3/2017' AND '3/7/2017'
GROUP BY THIS_OFFICE_ID) AS REQUIRED(REQ_OFFICE_ID, REQ_TOTAL) ON THIS_OFFICE_ID=REQUIRED.REQ_OFFICE_ID
WHERE REQUIRED.REQ_TOTAL > 20000
AND pushstat_date BETWEEN '3/3/2017' AND '3/7/2017'
GROUP by REQUIRED.REQ_TOTAL, THIS_OFFICE_ID, PUSHSTAT_DATE
ORDER by REQUIRED.REQ_TOTAL desc, THIS_OFFICE_ID, PUSHSTAT_DATE
Jag får fint mina offices med sin total summa transaktioner per office i sista kolonnen.
(1) Stockholm 03Mar16 5000 24000
(2) Stockholm 04Mar16 6000 24000
(3) Stockholm 05Mar16 7000 24000
(4) Stockholm 06Mar16 3000 24000
(5) Stockholm 07Mar16 3000 24000
Jag skulle vilja få returnerat det antalet dagar som officen har data på. Om jag räknar max(date)-min(date) ger Stockholm 5 dagar och Kiruna 5 dagar det är inte det jag vill ha.
Jag vill utelämna de dagar som inte har data, så att Stockholm returnerar 5 dagar och Kiruna 4 dagar. Kan man bygga in det på ett enkelt sätt?
Utnyttjar äggsperternas kunskap igen med denna statement som fungerar fint men som jag vill utöka:
Select THIS_OFFICE_ID as OFID_PCC_NR, PUSHSTAT_DATE AS THE_DATE,
SUM(TRANSACTION_CNT) as Total_Count, REQUIRED.REQ_TOTAL as OFID_PCC_Total FROM CAM_PUSH_STATISTICSTB
INNER JOIN
(SELECT THIS_OFFICE_ID, SUM(CAST(TRANSACTION_CNT as BIGINT)) FROM CAM_PUSH_STATISTICSTB
WHERE pushstat_date BETWEEN '3/3/2017' AND '3/7/2017'
GROUP BY THIS_OFFICE_ID) AS REQUIRED(REQ_OFFICE_ID, REQ_TOTAL) ON THIS_OFFICE_ID=REQUIRED.REQ_OFFICE_ID
WHERE REQUIRED.REQ_TOTAL > 20000
AND pushstat_date BETWEEN '3/3/2017' AND '3/7/2017'
GROUP by REQUIRED.REQ_TOTAL, THIS_OFFICE_ID, PUSHSTAT_DATE
ORDER by REQUIRED.REQ_TOTAL desc, THIS_OFFICE_ID, PUSHSTAT_DATE
Jag får fint mina offices med sin total summa transaktioner per office i sista kolonnen.
(1) Stockholm 03Mar16 5000 24000
(2) Stockholm 04Mar16 6000 24000
(3) Stockholm 05Mar16 7000 24000
(4) Stockholm 06Mar16 3000 24000
(5) Stockholm 07Mar16 3000 24000
Jag skulle vilja få returnerat det antalet dagar som officen har data på. Om jag räknar max(date)-min(date) ger Stockholm 5 dagar och Kiruna 5 dagar det är inte det jag vill ha.
Jag vill utelämna de dagar som inte har data, så att Stockholm returnerar 5 dagar och Kiruna 4 dagar. Kan man bygga in det på ett enkelt sätt?
Enkelt och enkelt, men det jag ser framför mig är att du joinar på ett subset på din huvudfråga.
Lite pseudokod:
Kod:
SELECT officeid, [annat tjafs], ISNULL(sub.antaldagar,0) As Datadagar FROM WHEREVER
LEFT OUTER JOIN(
SELECT officeId, COUNT(numDays)
FROM sometable where sometable.data IS NOT NULL
GROUP BY officeid) AS sub ON sub.officeId = WHEREVER.officeid
Jag har följande sql statement som fungerar fint och returnerar de offices vars summa transaktioner för hela perioden överstiger en viss siffra.
Select THIS_OFFICE_ID as OFID_PCC_NR, TRANSACTION_DATE AS THE_DATE,
SUM(TRANSACTION_CNT) as Total_Count, REQUIRED.REQ_TOTAL as OFID_PCC_Total FROM CAM_PUSH_STATISTICSTB
INNER JOIN
(SELECT THIS_OFFICE_ID, SUM(CAST(TRANSACTION_CNT as BIGINT)) FROM CAM_PUSH_STATISTICSTB
WHERE transaction_date BETWEEN '5/5/2017' AND '5/8/2017'
GROUP BY THIS_OFFICE_ID) AS REQUIRED(REQ_OFFICE_ID, REQ_TOTAL) ON THIS_OFFICE_ID=REQUIRED.REQ_OFFICE_ID
WHERE REQUIRED.REQ_TOTAL > 25000
AND transaction_date BETWEEN '5/5/2017' AND '5/8/2017'
GROUP by REQUIRED.REQ_TOTAL, THIS_OFFICE_ID, PUSHSTAT_DATE
ORDER by REQUIRED.REQ_TOTAL desc, THIS_OFFICE_ID, PUSHSTAT_DATE
Jag gör ett nytt försök då jag inte har lyckats med protons förslag (säger inte att det inte fungerar).
Jag vill endast ha i retur de grupper som överstiger en viss siffra och som inte saknar dagar i perioden. En missing record i db indikerar att det inte varit några transaktioner den dagen.
(1) Stockholm 05May17 5000
(2) Stockholm 06May17 6000
(3) Stockholm 07May17 7000
(4) Stockholm 08May17 6000
jag tänker mig ett villkor i where-delen i stilen med denna pseudokod:
WHERE '08-May-2017' MINUS '05-May-2017' + 1 MINUS returned_records_for_this_group = 0
dvs antalet dagar i perioden är lika med antalet returnerade records för gruppen för perioden.
Stockholmsgruppen skulle inte returneras, uppfyller antalet dagar men inte summan.
Kirunagruppen skulle inte returneras, uppfyller summan men inte antalet dagar.
Falungruppen skulle returneras, uppfyller både antalet dagar och summan.
Vad säger experterna?
__________________
Senast redigerad av dengo.dajorden 2017-05-31 kl. 15:46.
Jag har inte läst tråden utan endast sista posten och enligt den så blev här, jag kan alltså ha haft alldeles för bråttom.
declare @data table
(office varchar(36)
,transdate date
,transcount int)
insert into @data select 'Stockholm', '2017-05-05', 5000
insert into @data select 'Stockholm', '2017-05-06', 6000
insert into @data select 'Stockholm', '2017-05-07', 7000
insert into @data select 'Stockholm', '2017-05-08', 6000
insert into @data select 'Kiruna', '2017-05-05', 5000
insert into @data select 'Kiruna', '2017-05-06', 6000
insert into @data select 'Kiruna', '2017-05-08', 14000
insert into @data select 'Falun', '2017-05-05', 14000
insert into @data select 'Falun', '2017-05-06', 10000
insert into @data select 'Falun', '2017-05-07', 11000
insert into @data select 'Falun', '2017-05-08', 12000
select * from @data order by office desc, transdate
select dc.office,sum(dc.transcount)
from @data dc
where dc.transdate between '2017-05-05' and '2017-05-08'
group by dc.office
having count(*) = datediff(d,'2017-05-05',dateadd(d,1,'2017-05-08'))
and sum(dc.transcount) > 25000
office transdate transcount
------------------------------------ ---------- -----------
Stockholm 2017-05-05 5000
Stockholm 2017-05-06 6000
Stockholm 2017-05-07 7000
Stockholm 2017-05-08 6000
Kiruna 2017-05-05 5000
Kiruna 2017-05-06 6000
Kiruna 2017-05-08 14000
Falun 2017-05-05 14000
Falun 2017-05-06 10000
Falun 2017-05-07 11000
Falun 2017-05-08 12000
Tack, ska laborera med din 'having' få se om det funkar.
Min nuvarande statement returnerar gruppen as is (dvs alla records) då jag presenterar de i chart så en summa räcker inte.
I min sql statement när jag inkluderar count(pushstat_date) får jag alla my_office_id som är aggregerade under varje pushstat_date, tar jag istället count(distinct pushstat_date) får jag = 1 som bara visar att count(pushstat_date) bara räknar ett antal av samma pushstat_date.
Jag vill lägga till ett villkor till min nuvarande statement så att urvalet begränsas ytterligare, bara grupper med minst X antal records tas med.
SELECT this_office_id AS ofid_pcc_nr,
pushstat_date AS the_date,
transaction_cnt AS total_count,
ofid_pcc_total,
real_count,
Datediff(day, '2017-06-01', '2017-06-06') AS calender_count
FROM (SELECT this_office_id,
pushstat_date,
transaction_cnt,
Sum(transaction_cnt) OVER (partition BY this_office_id) AS ofid_pcc_total,
Count(*) OVER(partition BY this_office_id) AS real_count
FROM cam_push_statisticstb
WHERE pushstat_date BETWEEN '2017-06-01' AND '2017-06-06'
) AS a
WHERE ofid_pcc_total >= 240000
AND Datediff(day, '2017-06-01', '2017-06-06') - real_count BETWEEN 0 AND 5
ORDER BY ofid_pcc_total DESC, a.this_office_id, a.pushstat_date
Den returnerar dock FLERA datum records (med samma datum) för en viss office medan jag skulle vilja ha alla transaktioner för samma datum samma office aggregerade/summerade till en enda record.
Jag fattar att det ska vara en 'group by' men jag får diverse ORA-errors både när jag gör 'group by' i den inre statement eller i den yttre.
Jag är ingen äggspert men du kanske ska fundera på att börja om från scratch med den där sql satsen för den ser spontant överdrivet komplicerad ut.
Ska du "aggregera en aggregering" så kan en lösning vara att för ta fram ett aggregerat resultat i en temporär tabell och sedan aggergera, och/eller filtrera det, men det låter inte som att din uppgift är detta utan att det är att ett villkor/filter ska appliceras på ett aggregerade resultatet vilket kan lösas med "having ...."
Reservation för att jag läser frågeställningen felaktigt.
__________________
Senast redigerad av John-Paul 2017-06-10 kl. 13:25.
Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!
Stöd Flashback
Swish: 123 536 99 96Bankgiro: 211-4106
Stöd Flashback
Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!