I am currently working with a report through Microsoft Query and I ran into this problem where I need to calculate the total amount of money for the past year.
The table looks like this:
Item Number | Month | Year | Amount |
...........PAST YEARS DATA...........
12345 | 1 | 2019 | 10 |
12345 | 2 | 2019 | 20 |
12345 | 3 | 2019 | 15 |
12345 | 4 | 2019 | 12 |
12345 | 5 | 2019 | 11 |
12345 | 6 | 2019 | 12 |
12345 | 7 | 2019 | 12 |
12345 | 8 | 2019 | 10 |
12345 | 9 | 2019 | 10 |
12345 | 10 | 2019 | 10 |
12345 | 11 | 2019 | 10 |
12345 | 12 | 2019 | 10 |
12345 | 1 | 2020 | 10 |
12345 | 2 | 2020 | 10 |
How would you calculate the total amount from 02-2019 to 02-2020 for the item number 12345?
Assuming that you are running SQL Server, you can recreate a date with datefromparts() and use it for filtering:
select sum(amount)
from mytable
where
itemnumber = 12345
and datefromparts(year, month, 1) >= '20190201'
and datefromparts(year, month, 1) < '20200301'
You can use this also
SELECT sum(amount) as Amount
FROM YEARDATA
WHERE ( Month >=2 and year = '2019')
or ( Month <=2 and year = '2020')
and ItemNumber = '12345'
Suppose I have a SQL table as shown below where Min Spend is the minimum spend for each year and is a calculated column created using SQL-Window Function
|------------|-------|--------|----------|
| Year |Month | Spend |Min Spend |
|------------|-------|--------|----------|
| 2018 | Jan | 10 | 10 |
| 2018 | Feb | 20 | 10 |
| 2018 | Oct | 25 | 10 |
| 2019 | Jan | 90 | 45 |
| 2019 | Aug | 60 | 45 |
| 2019 | Nov | 45 | 45 |
|------------|-------|--------|----------|
I would like to create a new column as a calculated field in the table that gives me the month corresponding the the 'Min Spend' for that year as shown below
|------------|-------|--------|----------|---------------|
| Year |Month | Spend |Min Spend |Min Spend Month|
|------------|-------|--------|----------|---------------|
| 2018 | Jan | 10 | 10 | Jan |
| 2018 | Feb | 20 | 10 | Jan |
| 2018 | Oct | 25 | 10 | Jan |
| 2019 | Jan | 90 | 45 | Nov |
| 2019 | Aug | 60 | 45 | Nov |
| 2019 | Nov | 45 | 45 | Nov |
|------------|-------|--------|----------|---------------|
Can anybody suggest how to approach this?
You can use window functions like this:
select t.*,
min(spend) over (partition by year) as min_spend,
first_value(month) over (partition by year order by spend) as min_spend_month
from t;
tbl_vacations
vac_id | vac_name
1 | American vacation
2 | European vacation
tbl_vacation_stops
stop_id | vac_id | stop_sequence | stop_name | stop_strt_day | stop_end_day
1 | 1 | 1 | New York | may 1 2018 | may 3 2018
2 | 1 | 2 | Boston | may 4 2018 | may 6 2018
3 | 1 | 3 | Chicago | may 7 2018 | may 9 2018
4 | 2 | 1 | Paris | jun 10 2018 | jun 15 2018
5 | 2 | 2 | Berlin | jun 16 2018 | jun 19 2018
select
v.vac_id as vac_id,
v.vac_name as vac_name,
vs.stop_strt_day as vac_strt_day
from tbl_vacations v
join tbl_vacation_stops vs
where v.vac_id=vs.vac_id and vs.stop_sequence='1'
vac_id | vac_name | vac_strt_day | vac_end_day
1 | American vacation | may 1 2018 | may 9 2018
2 | European vacation | jun 10 2018 | jun 19 2018
If there are a different number of stops in each vacation, how do I figure out the vac_end_day based on max stop sequence?
this would do the trick:
select
v.vac_id as vac_id,
v.vac_name as vac_name,
(select stop_strt_day from tbl_vacation_stops where vac_id = v.vac_id
and stop_sequence = (select min(stop_sequence) from tbl_vacation_stops where vac_id =
v.vac_id)
) as vac_strt_day,
(select stop_end_day from tbl_vacation_stops where vac_id = v.vac_id
and stop_sequence = (select max(stop_sequence) from tbl_vacation_stops where vac_id =
v.vac_id)
) as vac_end_day
from tbl_vacations v
iam using sql to build report in report builder, SQL query i am using is as below
select count(*) [Total Clients], li.title,
SUBSTRING(li.title,CHARINDEX('_',li.title,CHARINDEX('_',li.title)+1)+1,2) as month1,
CASE SUBSTRING(li.title,CHARINDEX('_',li.title,CHARINDEX('_',li.title)+1)+1,5)
WHEN '01' THEN 'Jan'
WHEN '02' THEN 'Feb'
WHEN '03' THEN 'Mar'
WHEN '04' THEN 'Apr'
WHEN '05' THEN 'May'
WHEN '06' THEN 'June'
WHEN '07' THEN 'Jul'
WHEN '08' THEN 'Aug'
WHEN '09' THEN 'Sep'
WHEN '10' THEN 'Oct'
WHEN '11' THEN 'Nov'
WHEN '12' THEN 'Dec'
END As [Month],
SUBSTRING(li.title,CHARINDEX('_',li.title)+1,4),
li.CI_UniqueID,coll.name,coll.CollectionID,
SUM (CASE WHEN ucs.status=3 or ucs.status=1 then 1 ELSE 0 END ) as 'Installed / Not Applicable',
sum( case When ucs.status=2 Then 1 ELSE 0 END ) as 'Required',
sum( case When ucs.status=0 Then 1 ELSE 0 END ) as 'Unknown',
round((CAST(SUM (CASE WHEN ucs.status=3 or ucs.status=1 THEN 1 ELSE 0 END) as float)/count(*) )*100,2) as 'Compliant%',
round((CAST(count(case when ucs.status not in('3','1') THEN '*' end) as float)/count(*))*100,2) as 'NotCompliant%'
From v_Update_ComplianceStatusAll UCS
inner join v_r_system sys on ucs.resourceid=sys.resourceid
inner join v_FullCollectionMembership fcm on ucs.resourceid=fcm.resourceid
inner join v_collection coll on coll.collectionid=fcm.collectionid
inner join v_AuthListInfo LI on ucs.ci_id=li.ci_id
where coll.CollectionID like '%SMS00001%' and
--title like '%SUG%'
Title like '%P1%' and
Title like '%SUG_' + '' + CAST(year(getdate())-1 as varchar) + '' + '%'
--or Title like '%SUG_' + '' + CAST(year(getdate())-1 as varchar) + '' + '%'
group by li.title,li.CI_UniqueID,coll.name,coll.CollectionID
data displayed from query
+---------------+---------------------------+--------+-------+------------------+---------------------------------------------------------------------------------------------+----------------------+---------------+-----------------------------+----------+---------------------+---------------+
| Total Clients | title | month1 | Month | (No column name) | CI_UniqueID | name | CollectionID | Installed / Not Applicable | Required | Unknown Compliant% | NotCompliant% |
+---------------+---------------------------+--------+-------+------------------+---------------------------------------------------------------------------------------------+----------------------+---------------+-----------------------------+----------+---------------------+---------------+
| 30 | SUG_2017_01_P1_RFC3456 | 01 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_E586ED3A-EDD5-4145-98FB-C0B373F7E4CA | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_01-03_P1_RFC2781 | 01 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_5AEB5495-8913-4541-B29E-7D55C16E6B68 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_03_P1_RFC2781 | 03 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_ED07143C-B357-454E-B02E-7D81AEE40869 | All Systems SMS00001 | 0 | 0 | 30 | 0 | 100 |
| 30 | SUG_2017_04_P1_RFC3103 | 04 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_2722FDDB-6D6B-407F-A0CE-063372571E82 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_04-05_P1_RFC2781 | 04 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_10D742F8-FB4B-4E19-BF05-5210C790F440 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_06_P1_RFC3123 | 06 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_3063A272-0DF9-4033-94E2-C52AF1CFD4BC | All Systems SMS00001 | 25 | 1 | 4 | 83.33 | 16.67 |
| 30 | SUG_2017_10_P1_RFC3103 | 10 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_9C3F338B-E8BA-4AB5-8ECF-1EA8729825DA | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_11_P1_RFC3103 | 11 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_B42D69FC-2564-4542-8D5B-F5348A4080FF | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_12_P1_RFC3103 | 12 | NULL | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_5C3AD217-7747-4BAC-AD06-3851014BCB94 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
+---------------+---------------------------+--------+-------+------------------+---------------------------------------------------------------------------------------------+----------------------+---------------+-----------------------------+----------+---------------------+---------------+
titles shown as
SUG_2017_01_P1_RFC3456
SUG_2017_01-03_P1_RFC2781
SUG_2017_03_P1_RFC2781
i need to show only 01-03 months from these 3 rows i need on 01-03 SUG_2017_01-03_P1_RFC2781 and i need to discard jan row SUG_2017_01_P1_RFC3456 and march row means SUG_2017_03_P1_RFC2781
that applies to all rows i need
i need combine rows and not individual rows.
new data
+---------------+---------------------------+--------+-------+------+---------------------------------------------------------------------------------------------+----------------------+---------------+-----------------------------+----------+---------------------+---------------+
| Total Clients | title | month1 | Month | Year | CI_UniqueID | name | CollectionID | Installed / Not Applicable | Required | Unknown Compliant% | NotCompliant% |
+---------------+---------------------------+--------+-------+------+---------------------------------------------------------------------------------------------+----------------------+---------------+-----------------------------+----------+---------------------+---------------+
| 30 | SUG_2017_01_P1_RFC3456 | 01 | Jan | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_E586ED3A-EDD5-4145-98FB-C0B373F7E4CA | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_01-03_P1_RFC2781 | 01 | Jan | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_5AEB5495-8913-4541-B29E-7D55C16E6B68 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_03_P1_RFC2781 | 03 | Mar | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_ED07143C-B357-454E-B02E-7D81AEE40869 | All Systems SMS00001 | 11 | 15 | 4 | 36.67 | 63.33 |
| 30 | SUG_2017_04_P1_RFC3103 | 04 | Apr | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_2722FDDB-6D6B-407F-A0CE-063372571E82 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_04-05_P1_RFC2781 | 04 | Apr | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_10D742F8-FB4B-4E19-BF05-5210C790F440 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_06_P1_RFC3123 | 06 | June | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_3063A272-0DF9-4033-94E2-C52AF1CFD4BC | All Systems SMS00001 | 25 | 1 | 4 | 83.33 | 16.67 |
| 30 | SUG_2017_10_P1_RFC3103 | 10 | Oct | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_9C3F338B-E8BA-4AB5-8ECF-1EA8729825DA | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_11_P1_RFC3103 | 11 | Nov | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_B42D69FC-2564-4542-8D5B-F5348A4080FF | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2017_12_P1_RFC3103 | 12 | Dec | 2017 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_5C3AD217-7747-4BAC-AD06-3851014BCB94 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2018_01_P1_RFC3103 | 01 | Jan | 2018 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_A49E2378-BCB6-40BE-BE84-735CCFBEE43F | All Systems SMS00001 | 25 | 1 | 4 | 83.33 | 16.67 |
| 30 | SUG_2018_02_P1_RFC3118 | 02 | Feb | 2018 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_E6CBD108-2B1C-4C94-85F8-57174BEC34C4 | All Systems SMS00001 | 25 | 1 | 4 | 83.33 | 16.67 |
| 30 | SUG_2018_03_P1_RFC3128 | 03 | Mar | 2018 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_6AA69C57-9532-4ED1-BA40-1540C840BD69 | All Systems SMS00001 | 26 | 0 | 4 | 86.67 | 13.33 |
| 30 | SUG_2018_05_P1_RFC3104 | 05 | May | 2018 | ScopeId_A66804AF-F55C-40D6-8AAF-82CF49CC1E5B/AuthList_D3A10469-5DE5-4998-9C59-877D3BC7225F | All Systems SMS00001 | 12 | 14 | 4 | 40 | 60 |
+---------------+---------------------------+--------+-------+------+---------------------------------------------------------------------------------------------+----------------------+---------------+-----------------------------+----------+---------------------+---------------+
Try the following query
WITH commonQueryCTE AS(
-- your query is here
),
paramQueryCTE AS(
SELECT
*,
SUBSTRING(Title,5,4) Y,
SUBSTRING(Title,10,2) M1,
IIF(SUBSTRING(Title,12,1)='-',SUBSTRING(Title,13,2),NULL) M2
FROM commonQueryCTE
)
SELECT *
FROM paramQueryCTE c
WHERE NOT EXISTS(SELECT * FROM paramQueryCTE p WHERE c.Y=p.Y AND c.M1 BETWEEN p.M1 AND p.M2 AND p.M2 IS NOT NULL)
OR c.M2 IS NOT NULL
ORDER BY c.Y,c.M1
SQL Fiddle Demo - http://www.sqlfiddle.com/#!18/bf900/1
As variant you also can use SELECT ... INTO #TempTable FROM ... and after that use #TempTable in that query.
I have the following table.
Data_table
R_id I_id Metric CType Timespan Quantity Date
1 1 S C Week 100 4/5/2015
1 1 Q C Week 200 4/5/2015
1 1 I D Week 80 4/5/2015
1 2 S C Week 150 4/5/2015
1 2 Q C Week 100 4/5/2015
1 2 I D Week 50 4/5/2015
Metric can have a limited set of values (S, Q, I..)
CType will be C, D or nil.
Timespan can be Weekly/Daily.
Date will be a Sunday (start of week) for Weekly and that day's date for Daily.
My goal is to convert this to a daily view which would involve
If Timespan is Daily, copy the Quantity for the above metrics as it is.
Converting a Weekly quantity to 7 Daily quantities.
If the CType is D copy the quantity as it is.
If the CType is C use a constant percentage breakdown logic to distribute the weekly over 7 days.eg [30%, 10%, 10%, 5%, 10%, 15% 20%] = 100%
Creating the following VIEW.
R_id I_id Date S Q I ... (other metrics whose CType is not nil)
1 1 4/5/2015 30 60 80 ... (the quantity of the other metrics)
1 1 4/6/2015 10 20 80
1 1 4/7/2015 10 20 80
1 1 4/8/2015 5 10 80
1 1 4/9/2015 10 20 80
1 1 4/10/2015 15 30 80
1 1 4/11/2015 20 40 80
1 2 4/5/2015 45 30 50
1 2 4/6/2015 15 10 50
1 2 4/7/2015 15 10 50
1 2 4/8/2015 7.5 5 50
1 2 4/9/2015 15 10 50
1 2 4/10/2015 22.5 15 50
1 2 4/11/2015 30 20 50
I can write a bunch of java methods which will pull out the data from the above table and get the values for metrics as needed. But for a large dataset, the performance will not be very good. Databases are meant for this type of data computation. Once this view is created, I can quickly (and simply) query it to get what I want. I can write simple sql queries. But I have no clue how to even begin approaching this problem! I can see a PIVOT here (logically, I don't know how a query would or even can achieve it). But how to compute the 7 daily quantities from a weekly quantity and put it in the VIEW?
Suggestions and guidance will be much appreciated.
You can use hierarchical queries to generate daily data.
SQL Fiddle
Query:
select
r_id,
i_id,
metric,
ctype,
timespan,
quantity,
tdate + level - 1 as m_tdate,
level as m_level,
(case ctype
when 'C' then
(case level
when 1 then 0.3
when 2 then 0.1
when 3 then 0.1
when 4 then 0.05
when 5 then 0.1
when 6 then 0.15
when 7 then 0.2
end)
else 1
end) * quantity as m_quantity
from myt
where timespan = 'Week'
connect by level <= 7
and r_id = prior r_id
and i_id = prior i_id
and metric = prior metric
and ctype = prior ctype
and timespan = prior timespan
and prior sys_guid() is not null
This will generate seven day data for each record
Results:
| R_ID | I_ID | METRIC | CTYPE | TIMESPAN | QUANTITY | M_TDATE | M_LEVEL | M_QUANTITY |
|------|------|--------|-------|----------|----------|-----------------------|---------|------------|
| 1 | 1 | I | D | Week | 80 | May, 04 2015 00:00:00 | 1 | 80 |
| 1 | 1 | I | D | Week | 80 | May, 05 2015 00:00:00 | 2 | 80 |
| 1 | 1 | I | D | Week | 80 | May, 06 2015 00:00:00 | 3 | 80 |
| 1 | 1 | I | D | Week | 80 | May, 07 2015 00:00:00 | 4 | 80 |
| 1 | 1 | I | D | Week | 80 | May, 08 2015 00:00:00 | 5 | 80 |
| 1 | 1 | I | D | Week | 80 | May, 09 2015 00:00:00 | 6 | 80 |
| 1 | 1 | I | D | Week | 80 | May, 10 2015 00:00:00 | 7 | 80 |
| 1 | 1 | Q | C | Week | 200 | May, 04 2015 00:00:00 | 1 | 60 |
| 1 | 1 | Q | C | Week | 200 | May, 05 2015 00:00:00 | 2 | 20 |
| 1 | 1 | Q | C | Week | 200 | May, 06 2015 00:00:00 | 3 | 20 |
| 1 | 1 | Q | C | Week | 200 | May, 07 2015 00:00:00 | 4 | 10 |
| 1 | 1 | Q | C | Week | 200 | May, 08 2015 00:00:00 | 5 | 20 |
| 1 | 1 | Q | C | Week | 200 | May, 09 2015 00:00:00 | 6 | 30 |
| 1 | 1 | Q | C | Week | 200 | May, 10 2015 00:00:00 | 7 | 40 |
| 1 | 1 | S | C | Week | 100 | May, 04 2015 00:00:00 | 1 | 30 |
| 1 | 1 | S | C | Week | 100 | May, 05 2015 00:00:00 | 2 | 10 |
| 1 | 1 | S | C | Week | 100 | May, 06 2015 00:00:00 | 3 | 10 |
| 1 | 1 | S | C | Week | 100 | May, 07 2015 00:00:00 | 4 | 5 |
| 1 | 1 | S | C | Week | 100 | May, 08 2015 00:00:00 | 5 | 10 |
| 1 | 1 | S | C | Week | 100 | May, 09 2015 00:00:00 | 6 | 15 |
| 1 | 1 | S | C | Week | 100 | May, 10 2015 00:00:00 | 7 | 20 |
| 1 | 2 | I | D | Week | 50 | May, 04 2015 00:00:00 | 1 | 50 |
| 1 | 2 | I | D | Week | 50 | May, 05 2015 00:00:00 | 2 | 50 |
| 1 | 2 | I | D | Week | 50 | May, 06 2015 00:00:00 | 3 | 50 |
| 1 | 2 | I | D | Week | 50 | May, 07 2015 00:00:00 | 4 | 50 |
| 1 | 2 | I | D | Week | 50 | May, 08 2015 00:00:00 | 5 | 50 |
| 1 | 2 | I | D | Week | 50 | May, 09 2015 00:00:00 | 6 | 50 |
| 1 | 2 | I | D | Week | 50 | May, 10 2015 00:00:00 | 7 | 50 |
| 1 | 2 | Q | C | Week | 100 | May, 04 2015 00:00:00 | 1 | 30 |
| 1 | 2 | Q | C | Week | 100 | May, 05 2015 00:00:00 | 2 | 10 |
| 1 | 2 | Q | C | Week | 100 | May, 06 2015 00:00:00 | 3 | 10 |
| 1 | 2 | Q | C | Week | 100 | May, 07 2015 00:00:00 | 4 | 5 |
| 1 | 2 | Q | C | Week | 100 | May, 08 2015 00:00:00 | 5 | 10 |
| 1 | 2 | Q | C | Week | 100 | May, 09 2015 00:00:00 | 6 | 15 |
| 1 | 2 | Q | C | Week | 100 | May, 10 2015 00:00:00 | 7 | 20 |
| 1 | 2 | S | C | Week | 150 | May, 04 2015 00:00:00 | 1 | 45 |
| 1 | 2 | S | C | Week | 150 | May, 05 2015 00:00:00 | 2 | 15 |
| 1 | 2 | S | C | Week | 150 | May, 06 2015 00:00:00 | 3 | 15 |
| 1 | 2 | S | C | Week | 150 | May, 07 2015 00:00:00 | 4 | 7.5 |
| 1 | 2 | S | C | Week | 150 | May, 08 2015 00:00:00 | 5 | 15 |
| 1 | 2 | S | C | Week | 150 | May, 09 2015 00:00:00 | 6 | 22.5 |
| 1 | 2 | S | C | Week | 150 | May, 10 2015 00:00:00 | 7 | 30 |
Once you have this, you need to pivot the result, which can be done by simple GROUP BY
Query:
with x as (
select
r_id,
i_id,
metric,
ctype,
timespan,
quantity,
tdate + level - 1 as m_tdate,
level as m_level,
(case ctype
when 'C' then
(case level
when 1 then 0.3
when 2 then 0.1
when 3 then 0.1
when 4 then 0.05
when 5 then 0.1
when 6 then 0.15
when 7 then 0.2
end)
else 1
end) * quantity as m_quantity
from myt
where timespan = 'Week'
connect by level <= 7
and r_id = prior r_id
and i_id = prior i_id
and metric = prior metric
and ctype = prior ctype
and timespan = prior timespan
and prior sys_guid() is not null
UNION ALL
select
r_id,
i_id,
metric,
ctype,
timespan,
quantity,
tdate as m_tdate,
1 as m_level,
quantity as m_quantity
from myt
where timespan = 'Day'
)
select
r_id,
i_id,
m_tdate,
sum(case when metric = 'S' then m_quantity end) S,
sum(case when metric = 'Q' then m_quantity end) Q,
sum(case when metric = 'I' then m_quantity end) I
from x
group by
r_id,
i_id,
m_tdate
order by
r_id,
i_id,
m_tdate
Results:
| R_ID | I_ID | M_TDATE | S | Q | I |
|------|------|-------------------------|--------|--------|-----|
| 1 | 1 | May, 04 2015 00:00:00 | 30 | 60 | 80 |
| 1 | 1 | May, 05 2015 00:00:00 | 10 | 20 | 80 |
| 1 | 1 | May, 06 2015 00:00:00 | 10 | 20 | 80 |
| 1 | 1 | May, 07 2015 00:00:00 | 5 | 10 | 80 |
| 1 | 1 | May, 08 2015 00:00:00 | 10 | 20 | 80 |
| 1 | 1 | May, 09 2015 00:00:00 | 15 | 30 | 80 |
| 1 | 1 | May, 10 2015 00:00:00 | 20 | 40 | 80 |
| 1 | 2 | April, 03 2015 00:00:00 | (null) | (null) | 120 |
| 1 | 2 | May, 04 2015 00:00:00 | 45 | 30 | 50 |
| 1 | 2 | May, 05 2015 00:00:00 | 15 | 10 | 50 |
| 1 | 2 | May, 06 2015 00:00:00 | 15 | 10 | 50 |
| 1 | 2 | May, 07 2015 00:00:00 | 7.5 | 5 | 50 |
| 1 | 2 | May, 08 2015 00:00:00 | 15 | 10 | 50 |
| 1 | 2 | May, 09 2015 00:00:00 | 22.5 | 15 | 50 |
| 1 | 2 | May, 10 2015 00:00:00 | 30 | 20 | 50 |