MYSQL joining the sum of matching fields - join

I record eftpos payments that are payed as a group at the end of each day, but am having trouble matching individual payments to the daily total
Payments table:
|id | paymentjobno| paymentamount| paymentdate|paymenttype|
| 1 | 1000 | 10 | 01/01/2000 | 2 |
| 2 | 1001 | 15 | 01/01/2000 | 2 |
| 3 | 1002 | 18 | 01/01/2000 | 2 |
| 4 | 1003 | 10 | 01/01/2000 | 1 |
| 5 | 1004 | 127 | 02/01/2000 | 2 |
I want to return something like this so I can match it to $43 transactions on the following day and record payment ID numbers against the transaction
|id | paymentjobno| paymentamount| paymentdate|paymenttype|daytotal|
| 1 | 1000 | 10 | 01/01/2000 | 2 | 43 |
| 2 | 1001 | 15 | 01/01/2000 | 2 | 43 |
| 3 | 1002 | 18 | 01/01/2000 | 2 | 43 |
Below is my current attempt, but I only get one returned row per day even if there's multiple payments, and the daytotal is the same for every returned result, which is also not the value I was expecting. What am I doing wrong?
SELECT
id,
paymentjobno,
paymentamount,
paymentdate,
paymenttype,
t.daytotal
FROM payments
LEFT JOIN (
SELECT SUM(paymentamount) AS daytotal
FROM payments
GROUP BY paymentdate) t ON id = payments.id
WHERE paymenttype = 2 AND paymentdate $dateclause
GROUP BY payments.paymentdate

Related

joinging three tables in psql and keeping results according to group membership

I am using psql and joined three tables A, B and C from table A.
For example resulting table is as follows:
+----+------+------+------+
| pk | a_id | b_id | c_id |
+----+------+------+------+
| 1 | 5 | 12 | 16 |
| 2 | 5 | 7 | 8 |
| 3 | 5 | 6 | 21 |
| 4 | 8 | 12 | 16 |
| 5 | 8 | 3 | 9 |
| 6 | 9 | 11 | 32 |
| 7 | 9 | 8 | 2 |
+----+------+------+------+
I am trying to create c_id relations over a_id. In a_id there are three groups [5,8,9]. For example c_id=16 has a relation to a_id=[5,8], so c_id=[8,21,9,32] must be protected via a_id=[5,8]. And resulting table should look like as follows:
+----+------+------+------+
| pk | a_id | b_id | c_id |
+----+------+------+------+
| 1 | 5 | 12 | 16 |
| 2 | 5 | 7 | 8 |
| 3 | 5 | 6 | 21 |
| 4 | 8 | 12 | 16 |
| 5 | 8 | 3 | 9 |
+----+------+------+------+
How can I write such a condition in join statement?
After the join, you can write this query. I created your result table directly, and then I wrote a SQL query.
SELECT * from res
WHERE a_id in (SELECT distinct a_id
FROM res
WHERE c_id=16)

Retrieve last n rows based on one numeric column in google sheet

My data looks like this:
+---------------+-----+-----+------+-----+-----+
| Serial Number | LSL | LCL | DATA | UCL | USL |
+---------------+-----+-----+------+-----+-----+
| 1 | 1 | 3 | 2.3 | 7 | 9 |
| 2 | 1 | 3 | 3.1 | 7 | 9 |
| 3 | 1 | 3 | 2.7 | 7 | 9 |
| 4 | 1 | 3 | 4.9 | 7 | 9 |
| 5 | 1 | 3 | 5 | 7 | 9 |
| 6 | 1 | 3 | 3 | 7 | 9 |
| 7 | 1 | 3 | 10 | 7 | 9 |
| 8 | 1 | 3 | 7.8 | 7 | 9 |
| 9 | 1 | 3 | | 7 | 9 |
| 10 | 1 | 3 | 6.8 | 7 | 9 |
| 11 | 1 | 3 | 10 | 7 | 9 |
| 12 | 1 | 3 | 3.9 | 7 | 9 |
| 13 | 1 | 3 | 11.3 | 7 | 9 |
| 14 | 1 | 3 | | 7 | 9 |
| 15 | 1 | 3 | | 7 | 9 |
| 16 | 1 | 3 | | 7 | 9 |
| 17 | 1 | 3 | | 7 | 9 |
| 18 | 1 | 3 | | 7 | 9 |
| 19 | 1 | 3 | | 7 | 9 |
| 20 | 1 | 3 | | 7 | 9 |
+---------------+-----+-----+------+-----+-----+
I want to query last 7 rows data where the DATA column is not empty. Trying to achieve something like this:
+----+---+---+------+---+---+
| 7 | 1 | 3 | 10 | 7 | 9 |
| 8 | 1 | 3 | 7.8 | 7 | 9 |
| 9 | 1 | 3 | | 7 | 9 |
| 10 | 1 | 3 | 6.8 | 7 | 9 |
| 11 | 1 | 3 | 10 | 7 | 9 |
| 12 | 1 | 3 | 3.9 | 7 | 9 |
| 13 | 1 | 3 | 11.3 | 7 | 9 |
+----+---+---+------+---+---+
But currently, I am only able to get the last 7 rows data which looks like this:
+---------------+-----+-----+------+-----+-----+
| Serial Number | LSL | LCL | DATA | UCL | USL |
+---------------+-----+-----+------+-----+-----+
| 14 | 1 | 3 | | 7 | 9 |
| 15 | 1 | 3 | | 7 | 9 |
| 16 | 1 | 3 | | 7 | 9 |
| 17 | 1 | 3 | | 7 | 9 |
| 18 | 1 | 3 | | 7 | 9 |
| 19 | 1 | 3 | | 7 | 9 |
| 20 | 1 | 3 | | 7 | 9 |
+---------------+-----+-----+------+-----+-----+
The formula I used is:
=SORT(QUERY(Sheet1!A7:F,"order by A desc limit 7"),1,1)
This formula does not incorporate the condition that the last row of DATA column must not be empty. Is there a way to achieve what I am looking for?
Assuming your serial numbers are consecutive and sorted as such.
=QUERY(A:F,"Select * where A >= "&ARRAYFORMULA(INDEX(SORT(A2:F,1,false),MATCH(true,ISNUMBER(INDEX(SORT(A2:F,1,false),,4)),0),1))-6&" limit 7")
Breakdown:
=QUERY(A:F,"Select * where A >= "
//index used to find the first serial number with a number in the data column
&ARRAYFORMULA(INDEX(
//reverse order
SORT(A2:F,1,false),
//find first number in data column of reversed data
MATCH(true,ISNUMBER(
//get fourth column (data column) to check for numbers
INDEX(SORT(A2:F,1,false),,4)
//minus 6 so you can get the 6 rows above and the row found
),0),1))-6
//get the first 7 rows from the serial number that matches.
&" limit 7")
EDIT
After our conversation:
If your first column is a date and your dates are consecutive with no duplicates, you can use this:
=QUERY(A:F,"Select * where A >= date '"&TEXT(INDEX(SORT(A2:F,1,false),MATCH(true,ISNUMBER(INDEX(SORT(A2:F,1,false),,4)),0),1)-6,"yyyy-mm-dd")&"' limit 7")
Breakdown:
=QUERY(A:F,"Select * where A >= date
//date tells query that it's looking for a date value
'"&TEXT(INDEX(SORT(A2:F,1,false),MATCH(true,ISNUMBER(INDEX(SORT(A2:F,1,false),,4)),0),1)-6,
"yyyy-mm-dd")&"' limit 7"))
//text formats the date in the way that query requires: yyyy-mm-dd
Based on description rather than example:
=query(query(A:F,"where D is not NULL order by A desc limit 7"),"order by Col1")
("last 7 rows data where the DATA column is not empty.")

Google Sheets Query - Sum of ColX depending on ColY

So I have the following data:
|Country | Shop | Qty |
-----------------------------
|Austrailia | Shop 1 | 3
|Austrailia | Shop 2 |
|Austrailia | Shop 3 |
|Austrailia | Shop 4 |
|Japan | Shop 5 | 10
|Japan | Shop 6 | 1
|Japan | Shop 7 |
|Japan | Shop 8 |
|Japan | Shop 9 |
|Japan | Shop 10 |
|Austria | Shop 11 |
|Belgium | Shop 12 |
|Belgium | Shop 13 |
|Belgium | Shop 14 | 45
|Belgium | Shop 15 |
|Belgium | Shop 16 |
|Belgium | Shop 17 |
|Belgium | Shop 18 |
|Denmark | Shop 19 |
|Finland | Shop 20 | 2
I want to create another table in a different tab that queries this table and gives me the sum of the different shops qty row, per country. So, for example, it would output the following:
|Country | Qty
-----------------
|Austrailia | 3
|Japan | 11
|Austria | 0
|Belgium | 45
|Denmark | 0
|Finland | 2
I've been playing around with the QUERY command but can't get it to output what i need :(
=QUERY(A1:C21,"Select A,sum(C) group by A",1)

Dynamically lookup and get average using arrayformula

I'm trying to get the average of all rows containing data in my SourceSheet, which need to be matched with the Fish ID A1:F1 in Sheet1 and A2:A5 in SourceSheet. I want to do this by using ARRAYFORMULA() since Sheet1!A2:A5 is dynamic and may contain other values from time to time.
So far, I've only managed the lookup-and-average-part by:
=AVERAGE(ARRAYFORMULA(HLOOKUP($A2,SourceSheet!A:F,ROW(Items!A$2:F),FALSE)))
How do i achieve the result (see below) with out copying this formula down all rows? Thanks in advance!
Source Data (SourceSheet)
+------+--------+-----+--------+---------+---------+
| tuna | mullet | cod | salmon | herring | catfish |
+------+--------+-----+--------+---------+---------+
| 4 | 3 | 5 | 5 | 5 | 3 |
| 5 | 3 | 3 | 1 | 3 | 2 |
| 5 | 4 | 4 | 4 | 4 | 4 |
| 1 | 2 | 1 | 2 | 3 | 1 |
| 3 | 2 | 2 | 2 | 3 | 2 |
| 4 | 2 | 4 | 2 | 3 | 3 |
| 4 | 2 | 2 | 1 | 2 | 1 |
| 4 | 3 | 4 | 3 | 5 | 4 |
| 3 | 4 | 4 | 2 | 5 | 1 |
| 4 | 3 | 4 | 1 | 2 | 2 |
| 2 | 1 | 3 | 1 | 1 | 1 |
| 2 | 4 | 3 | 2 | 2 | 2 |
| 5 | 3 | 5 | 4 | 5 | 2 |
| 4 | 2 | 4 | 2 | 3 | 2 |
| 2 | 4 | 4 | 3 | 4 | 2 |
| 5 | 4 | 5 | 5 | 3 | 2 |
| 3 | 1 | 3 | 3 | 4 | 2 |
+------+--------+-----+--------+---------+---------+
What I'm trying to achieve: (Sheet1)
+---------+---------+
| | Average |
+---------+---------+
| mullet | 2.76 |
| salmon | 2.75 |
| herring | 2.73 |
| catfish | 2.64 |
+---------+---------+
Formula
=ArrayFormula(
MMULT(
hlookup(A2:A5,SourceSheet!A:F,
TRANSPOSE(FILTER(ROW(SourceSheet!A2:A),LEN(SourceSheet!A2:A))),FALSE),
n(ISNUMBER((FILTER(ROW(SourceSheet!A2:A),LEN(SourceSheet!A2:A)))))
)
/
count(SourceSheet!A2:A)
)
Explanation
AVERAGE is an aggregate function. It could take several values separated by commas, one array or several arrays of values as arguments and returns a single value. This kind of functions if are used on an array formulas will return a single value, so when it's require to return an array of values it's required to use other methods.
In this case, MMULT is used to return the sum of values of each row.
See also
Using CHOOSE and CONCATENATE with ARRAYFORMULA in Google Sheets

Cucumber table + find("table tr:eq(x)") not working right

I have this cucumber task:
Then I should see following posting modes
| row | day | hour | minute | location | category |
| 1 | 1 | 7 | 0 | 29 | 6 |
| 2 | 2 | 8 | 5 | 27 | 7 |
| 3 | 3 | 9 | 10 | 28 | 18 |
| 4 | 4 | 15 | 15 | 29 | 18 |
| 5 | 5 | 17 | 20 | 27 | 7 |
| 6 | 6 | 20 | 30 | 28 | 6 |
| 6 | 0 | 22 | 50 | 29 | 7 |
And behind it there is this description:
Then /^I should see following posting modes$/ do |table|
table.hashes.each do |posting|
within("#itemPosting .attributeContainer table tbody tr:eq(#{posting[:row]})") do
find("#item_posting_day").value.should == posting[:day]
find("#item_posting_hour").value.should == posting[:hour]
find("#item_posting_minute").value.should == posting[:minute]
find("#item_posting_location").value.should == posting[:location]
find("#item_posting_category").value.should == posting[:category]
end
end
end
So this part:
tr:eq(#{posting[:row]})
doesn't work(it goes to next step, and then gives an error that #item_posting_day is not found.)
But if I do this instead:
tr:eq(4)
It works (finds the #item_posting_day field, gets its value, and then gives an error saying that value is not what is expected to be, but that's ok).
So I don't understand what's the problem with using this syntax:
tr:eq(#{posting[:row]})
It seems that hashes converts column headers to strings, not symbols. Try to use 'row' instead of :row

Resources