Neo4j get average relationships - redis
The following nodes relationships
(u:user{id:'some_id'})-[hpl:HAS_PRODUCT_LIST]->(pl:productList)<-[ipl:IN_PRODUCT_LIST]-(p:product)
I need to get the average products per product list.
I tried
MATCH (u:user{id: 'some_id'})-[hpl: HAS_PRODUCT_LIST]->(pl:productList)<-[ipl:IN_PRODUCT_LIST]-(p:product)
WITH count(hpl) as hplc, count(p) as pc
RETURN pc / hplc
I'm getting a wrong calculation.
Let's say there are three product lists plA, plB and plC. Then for plA, you have 2 products, plB has 3 products and plC has 1. Your query will give you 3 / ( 2 + 3 + 1 ) = 3 / 6 = 0.5 which is not correct. The average product count is 6/3 or 2.
Thus, your query should do the count on the product list pl and NOT on the relationship type hpl
WITH count(pl) as plc, count(p) as pc
RETURN pc / plc
Related
SQL- How to get value from a different table without joining to use on a equation?
I have a table with total user count of a company by their divisions, and I have another table with total spend on multiple different products, I want to identify the per capita spend value for each product by dividing each total spend on a product by the total use count from all the divisions. Division User Count A 10 B 20 C 20 D 50 Total 100 Product Table, Product Total Spend Apple 670 Orange 580 Grapes 640 Tomato 1050 End result should be , Product Total Spend Apple 6.7 Orange 5.8 Grapes 6.4 Tomato 10.5 Since there is nothing common among these tables to join, I need a way to get the total of the column of User count and use it in an equation in the query. It has to be dynamic so that even if the user count changes it will reflect on the per capita spend. I'm using Zoho Analytics to do my online queries.
You can just aggregate before joining: select p.*, p.spend * 1.0 / d.user_count from product p cross join (select sum(user_count) as user_count from divisions ) d;
SQL - Finding out how to write a case statement depending on how many times a name shows up in a column
I need some help with an SQL exercise that has me completely stumped. For an assignment, I have a question asking me to print a list of names with different descriptions attached depending on how many times they appear in a pre-existing list. The question verbatim is posted below for reference: SI schema contains customers that have bought one or more vehicles. They can be classified using the following criteria: Customers that have bought only one car (one-time buyer) Customer that have bought two cars (two-time buyer) Customers that have bought more than two cars (frequent buyer) Using a SINGLE SELECT statement, display a list of customers with their names and what type of buyer they are for all those customers that have bought Jaguar car makes. The code I have written is posted here: use si; select saleinv.custname, count(case when saleinv.custname = 1 then 'One-Time Purchaser' when saleinv.custname = 2 then 'Two-Time Purchaser' else 'Frequent Purchaser' end) as "purchtype" from si.saleinv inner join si.car on car.custname = saleinv.custname where (car.carmake like 'JAGUAR'); That is just what I have currently -- I am constantly taking things out and adding things and rearranging things -- nothing seems to work. I am being met with error after error. I have been trying to follow along with any CASE statement resources I can find including the ones provided to me by my instructor, but nothing seems to be helping me. There are plenty of resources detailing what to do in regards to working with directly assigned values, but never anything related to I'm supposed to use this to find the amount of items that appear in a list. It doesn't matter how well I follow along with example code, my IDE just isn't liking what I am putting in. I don't want any outright changes to my code, I just want somebody to point out what I'm doing wrong because at the moment, I have no clue whatsoever. I am brand new to StackOverflow (in terms of actually posting content on the site), so I may not know how to navigate replies and posts and such, but I'll do my best. Thank you all.
As I didn't get complete idea of your database structure, I am assuming you have 3 tables Customers, Purchases and Cars. You can use corelated subquery to use CASE on aggregate functions. SELECT CustomerID, CASE WHEN t1.TotalPurchase = 1 THEN 'one-time-buyer' CASE WHEN t1.TotalPurchase = 2 THEN 'two-times-buyer' CASE WHEN t1.TotalPurchase > 2 THEN 'frequent-buyer' AS 'PurchaserType' FROM (SELECT CustomerID, COUNT(*) as TotalPurchases FROM Purchases GROUP BY CustomerID ) AS t1 You can add rest of your joins according to get other required columns.
I'll demonstrate with R's mtcars dataset. cyl is a reasonable field to test on, so I'll project that as your "Customer name". A change for this example: I'll use ranges of values instead of simple equality. with counts as ( select cyl, count(*) as n from mtcars group by cyl ) select c.cyl, c.n, case when c.n <= 8 then 'small' when 8 < c.n and c.n <= 12 then 'medium' when 12 < c.n then 'large' end as something from counts c cyl n something 4 11 medium 6 7 small 8 14 large I think you intend to join it back on some data, likely from another table. I'll just join it back on itself (odd perhaps), effectively the same method. with counts as ( select cyl, count(*) as n from mtcars group by cyl ) select mt.cyl, mt.disp, c.n, case when c.n <= 8 then 'small' when 8 < c.n and c.n <= 12 then 'medium' when 12 < c.n then 'large' end as something from mtcars mt inner join counts c on mt.cyl = c.cyl cyl disp n something 6 160.0 7 small 6 160.0 7 small 4 108.0 11 medium 6 258.0 7 small 8 360.0 14 large 6 225.0 7 small 8 360.0 14 large ...truncated (This was done in SQLite, though it should perform the same in other DBMSs.) Data "car","mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb" "Mazda RX4",21,6,160,110,3.9,2.62,16.46,0,1,4,4 "Mazda RX4 Wag",21,6,160,110,3.9,2.875,17.02,0,1,4,4 "Datsun 710",22.8,4,108,93,3.85,2.32,18.61,1,1,4,1 "Hornet 4 Drive",21.4,6,258,110,3.08,3.215,19.44,1,0,3,1 "Hornet Sportabout",18.7,8,360,175,3.15,3.44,17.02,0,0,3,2 "Valiant",18.1,6,225,105,2.76,3.46,20.22,1,0,3,1 "Duster 360",14.3,8,360,245,3.21,3.57,15.84,0,0,3,4 "Merc 240D",24.4,4,146.7,62,3.69,3.19,20,1,0,4,2 "Merc 230",22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2 "Merc 280",19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4 "Merc 280C",17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4 "Merc 450SE",16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3 "Merc 450SL",17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3 "Merc 450SLC",15.2,8,275.8,180,3.07,3.78,18,0,0,3,3 "Cadillac Fleetwood",10.4,8,472,205,2.93,5.25,17.98,0,0,3,4 "Lincoln Continental",10.4,8,460,215,3,5.424,17.82,0,0,3,4 "Chrysler Imperial",14.7,8,440,230,3.23,5.345,17.42,0,0,3,4 "Fiat 128",32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1 "Honda Civic",30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2 "Toyota Corolla",33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1 "Toyota Corona",21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1 "Dodge Challenger",15.5,8,318,150,2.76,3.52,16.87,0,0,3,2 "AMC Javelin",15.2,8,304,150,3.15,3.435,17.3,0,0,3,2 "Camaro Z28",13.3,8,350,245,3.73,3.84,15.41,0,0,3,4 "Pontiac Firebird",19.2,8,400,175,3.08,3.845,17.05,0,0,3,2 "Fiat X1-9",27.3,4,79,66,4.08,1.935,18.9,1,1,4,1 "Porsche 914-2",26,4,120.3,91,4.43,2.14,16.7,0,1,5,2 "Lotus Europa",30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2 "Ford Pantera L",15.8,8,351,264,4.22,3.17,14.5,0,1,5,4 "Ferrari Dino",19.7,6,145,175,3.62,2.77,15.5,0,1,5,6 "Maserati Bora",15,8,301,335,3.54,3.57,14.6,0,1,5,8 "Volvo 142E",21.4,4,121,109,4.11,2.78,18.6,1,1,4,2
Grouping and Summing Totals in a Joined Table
I have two tables Medication and Inventory. I'm trying to SELECT all the below details from both tables but there are multiple listings of medication ids with different BRANCH_NO also in the INVENTORY table (the primary key in INVENTORY is actually BRANCH_NO, MEDICATION_ID composite key) I need to total up the various medication_IDs and also join the tables in one SELECT command and display all the infomation for each med (there are 5) with a total sum of each med at the end of each row. But im getting all muddled trying Group by and Sum and at one point partition. Help please I'm new to this. Below is the latest non working version - but it doesn't display Medication Name Medication Desc Manufacturer Pack Size like i chanced it might. SELECT I.MEDICATION_ID, SUM(I.STOCK_LEVEL) FROM INVENTORY I INNER JOIN (SELECT MEDICATION_NAME, SUBSTR(MEDICATION_DESC,1,20) "Medication Description", MANUFACTURER, PACK_SIZE FROM MEDICATION) M ON MEDICATION_ID=I.MEDICATION_ID GROUP BY I.MEDICATION_ID; For the data imagine I want this sort of output: MEDICATION_ID MEDICATION_NAME STOCK_LEVEL OtherColumns..... 1 Alpha 10 2 Bravo 20 3 Charlie 20 1 Alpha 30 4 Delta 10 5 Echo 20 5 Echo 40 2 Bravo 10 grouping and totalling into this: MEDICATION_ID MEDICATION_NAME STOCK_LEVEL OtherColumns..... 1 Alpha 40 2 Bravo 30 3 Charlie 20 4 Delta 10 5 Echo 60 I can get this when its just one table but when Im trying to join tables and also SELECT things its just not working. Thanks in advance guys. I appreciate it may be a simple solution, but it will be a big help.
You need to write explicitly all non-aggregated columns into both SELECT and GROUP BY lists ( Btw, no need to use a nested query, and if it's the case MEDICATION_ID column is missing in it ) : SELECT I.MEDICATION_ID, M.MEDICATION_NAME, SUM(I.STOCK_LEVEL) AS STOCK_LEVEL, SUBSTR(M.MEDICATION_DESC,1,20) "Medication Description", M.MANUFACTURER, M.PACK_SIZE FROM INVENTORY I JOIN MEDICATION M ON M.MEDICATION_ID = I.MEDICATION_ID GROUP BY I.MEDICATION_ID, M.MEDICATION_NAME, SUBSTR(M.MEDICATION_DESC,1,20), M.MANUFACTURER, M.PACK_SIZE; This way, you'll be able to return all the listed columns.
Access SQL: How to specify which record to return based on the "more important" condition?
I have 2 tables (MS ACCESS): Table "Orders" OrderID Product Product_Group Client Client_Group Revenue 1 Cars Vehicles Men People 10 000 2 Houses NC_Assets Women People 15 000 3 Houses NC_Assets Partnersh Companies 12 000 4 Cars Vehicles Corps Companies 3 000 Table "Gouping" Product Product_Group Client Client_Group Tax rate Cars Companies Taxable 30% Vehicles Companies Taxable 15% Houses People Taxable 13% Houses Women Taxable 15% I want to join these tables to see which orders will fall into which taxable group. As you can see some products/clients are mapped differently than their groups -> if that is the case, the query should return only one record for this pair and exclude any pairing containing their groups. In pseudo-code: If there's product-client grouping, return this record Else If there's product-client grouping ---//----- else If there's product group - client ----///-----else If there's product group-client group ---///---- End if * 4 In that order. Now my query (pseudo): SELECT [Orders].*, [Grouping].* FROM [Orders] LEFT JOIN [Grouping] ON (([Orders].Product = [Grouping].Product OR [Orders].Product_Group = [Grouping].Product_Group) AND ([Orders].Client = [Grouping].Client OR [Orders].Client_Group = [Grouping].Client_Group)) Returns both Cars-Companies and Vehicles-Companies. I'm out of ideas how to set it up to get only the most granular records from each combination. UNION? NOT EXISTS? Any help appreciated.
I want to join these tables to see how many orders qualify as good, mediocre etc. Sounds like you want counts of the particular conditions...Assuming you have a SUM and CASE (I haven't written queries for MS Access in about 10 years...), here's some pseudo-code that should get you started: SELECT SUM(CASE WHEN {mediocre-conditions} THEN 1 ELSE 0 END) AS MediocreCount, SUM(CASE WHEN {good-conditions} THEN 1 ELSE 0 END) AS GoodCount, SUM(CASE WHEN {great-conditions} THEN 1 ELSE 0 END) AS GreatCount FROM [Orders] LEFT JOIN [Grouping] ON (([Orders].Product = [Grouping].Product OR [Orders].Product_Group = [Grouping].Product_Group) AND ([Orders].Client = [Grouping].Client OR [Orders].Client_Group = [Grouping].Client_Group)) [update] I don't like giving bad answers, so did a quick look...based on this link: Does MS Access support "CASE WHEN" clause if connect with ODBC?, it appears you may be able to do: SELECT SUM(IIF({mediocre-conditions},1,0)) AS MediocreCount, SUM(IIF({good-conditions},1,0)) AS GoodCount, SUM(IIF({great-conditions},1,0)) AS GreatCount
Omit item from Sum SQL
I'm very new to programming and SQL, I can't figure this one out, perhaps I haven't learned the concept yet, but I'm hoping you can help me. Sorry if it's too easy and boring. /*2.37 Write an SQL statement to display the WarehouseID and the sum of QuantityOnHand,grouped by WarehouseID. Omit all SKU items that have 3 or more items on hand from the sum, and name the sum TotalItemsOnHandLT3 and display the results in descending order of TotalItemsOnHandLT3.*/ SELECT WarehouseID, SUM(QuantityOnHand) AS TotalItemsOnHandLT3 FROM INVENTORY GROUP BY WarehouseID HAVING COUNT(WarehouseID) >= 3 ORDER BY TotalItemsOnHandLT3 DESC
"Omit all SKU items that have 3 or more items on hand from the sum", sounds more like : FROM INVENTORY WHERE QuantitiyOnHand < 3 rather than : HAVING COUNT(WarehouseID) >= 3
INVENTORY is the list of products (SKU = Stock Keeping Unit = Individual Product Stored in the warehouse) where every product has a WarehouseID. This warehouseID presumably determines where the product is stored. By Omit all SKU items, it asks you to only display those products that are stored in minimum 3 places in the warehouse. This can be done with the having clause, HAVING COUNT(WarehouseID) >= 3 I do not know the structure and data of your INVENTORY table, but simply put, Consider your data is like this: SKUID WareHouseID QuantityOnHand 1 1 10 1 2 10 2 1 10 1 3 5 2 2 20 In the above case, Product = 1 (SKUID), is stored in 3 different warehouses whereas product 2 is stored in 2 warehouses. Hence, SKUID COUNT(WareHouseID) SUM(QuantityOnHand) 1 3 25 2 2 30 In this case, your query will only "Omit" product 1, and not the product 2.
Its says Omit, they why HAVING COUNT(WarehouseID) >= 3 and not HAVING COUNT(WarehouseID) < 3