How to aggregate rows into one month - sql

I'm attempting to combine data that I am selecting from another table.
This table has a column named IdClient_PK which is a uniqueID and a column DateJoinKey which is the date this user viewed a page.
I would like to combine all DateJoinKey into one month. So For example:
IDClient_PK
DateJoinKey
Views
0E984725-C51C-4BF4-9960-E1C80E27ABA0
01-1-2021
2
0E984725-C51C-4BF4-9960-E1C80E27ABA0
01-3-2021
1
0E984725-C51C-4BF4-9960-E1C80E27ABA0
01-14-2021
3
0E984725-C51C-4BF4-9960-E1C80E27ABA0
01-21-2021
1
I'm attempting to get a result that looks like this:
IDClient_PK
DateJoinKey
Views
0E984725-C51C-4BF4-9960-E1C80E27ABA0
01-1-2021
7
How am I able to do this?
I attempted using the FORMAT() statement in SQL but I run into an error saying: Conversion failed when converting date and/or time from character string.
Here is an example of my query:
CREATE TABLE #tmpModule2(
[IdClient_PK] uniqueidentifier,
[DateJoinKey] DATETIME,
[Views] INT
)
INSERT INTO #tmpModule ([IdClient_PK],[DateJoinKey], [Views] )
SELECT a.[IdClient_PK],
FORMAT(a.DateJoinKey, 'yyyy-MM'),
SUM(a.ViewValue)
FROM [usage].[Fact_RegisteredUsers_UserReport] a
GROUP BY
a.IdClient_PK,
FORMAT(a.DateJoinKey, 'yyyy-MM'),

FORMAT() returns a NVARCHAR data type, but your temp table has that column as a DATETIME. You can either change your CREATE to use the proper data type or SELECT INTO like below. Or you could convert that returned column that you have above to a DATETIME before you insert into your temp table.
SELECT a.[IdClient_PK],
FORMAT(a.DateJoinKey, 'yyyy-MM') as [DateJoinKey],
SUM(a.ViewValue) AS [Views]
INTO #tmpModule
FROM [usage].[Fact_RegisteredUsers_UserReport] a
GROUP BY
a.IdClient_PK,
FORMAT(a.DateJoinKey, 'yyyy-MM')

Related

create an empty string in DATE format BigQuery SQL

I need to create an empty string/null value. It has to be DATE type. I am UNIONing a couple of tables. Table 1 has date column, table 2 and 3 do not.
Below is the snippet of code for one table that doesn't have date column.
SELECT
CAST(TIMESTAMP('') AS DATE) AS date,
coalesce(id, 'unknown') AS id
FROM
`my_table`
I received the following error: Invalid timestamp: ''
Is there a way to create null value with DATE type?
Thank you in advance.
select cast(null as date) as date
with output

Selecting most recent timestamp row and getting values from a column with a Variant DataType

I hope the title makes some sense, I'm open to suggestions if I should make it more readable.
I have a temp table in Snowflake called BI_Table_Temp. It has 2 columns Load_DateTime with a datatype Timestamp_LTZ(9) and JSON_DATA which is a Variant datatype that's has nested records from a JSON file. I want to query this table which I then plan to ingest to another table but I want to make sure I always get the most recent Load_DateTime row.
I've tried this, which works but it shows me the Load_DateTime column and I don't want that I just want to get the values from the JSON_DATA row that has the max Load_DateTime timestamp:
SELECT
MAX(Load_DateTime),
transactions.value:id::string as id
transactions.value:value2::string as account_value
transactions.value:value3::string as new_account_value
FROM BI_Table_Temp,
LATERAL FLATTEN (JSON_DATA:transactions) as transactions
GROUP BY transactions.value
A simple option:
WITH data AS (
SELECT Load_DateTime
, transactions.value:id::string as id
, transactions.value:value2::string as account_value
, transactions.value:value3::string as new_account_value
FROM BI_Table_Temp,
LATERAL FLATTEN (JSON_DATA:transactions) as transactions
), max_load AS (
SELECT MAX(Load_DateTime) Load_DateTime, id
FROM data,
GROUP BY id
)
SELECT transactions.value:id::string as id
, transactions.value:value2::string as account_value
, transactions.value:value3::string as new_account_value
FROM data
JOIN max_load
USING (id, Load_DateTime)
Since transactions.value is a variant, I'm guessing that for GROUP BY transactions.value you really mean GROUP BY transactions.value:id.

Set column type with a select ... into statement

I'm trying to create a table using a SELECT ... INTO statement. The table is created and populates properly, but I want to change the data type of two of the columns.
SELECT DISTINCTROW
AR_Server_Pre.OrderID,
AR_Server_Pre.LineTotal,
AR_Server_Pre.[Total payments],
AR_Server_Pre.ShipDate,
(AR_Server_Pre.LineTotal-nz(AR_Server_Pre.[Total Payments])) AS AmountDue
INTO AR_Final
FROM AR_Server_Pre
WHERE
((([AR_Server_Pre].[LineTotal]-nz([AR_Server_Pre].[Total Payments]))>0.5)
AND
((AR_Server_Pre.ShipDate)<Date()));
I want to assign column type of currency to LineTotal and AmountDue. AR_Server_Pre is a Select Query, so the simple solution of "Change it at that table) won't work.
You can wrap the specified fields in a CCur() function to force them to be Currency, e.g.,
SELECT DISTINCTROW
AR_Server_Pre.OrderID,
CCur(AR_Server_Pre.LineTotal) AS LineTotal,
...

Check if field is numeric, then execute comparison on only those field in one statement?

This may be simple, but I am no SQL whiz so I am getting lost. I understand that sql takes your query and executes it in a certain order, which I believe is why this query does not work:
select * from purchaseorders
where IsNumeric(purchase_order_number) = 1
and cast(purchase_order_number as int) >= 7
MOST of the purchar_order_number fields are numeric, but we introduce alphanumeric ones recently. The data I am trying to get is to see if '7' is greater than the highest numeric purchase_order_number.
The Numeric() function filters out the alphanumeric fields fine, but doing the subsequent cast comparison throws this error:
Conversion failed when converting the nvarchar value '124-4356AB' to data type int.
I am not asking what the error means, that is obvious. I am asking if there is a way to accomplish what I want in a single query, preferably in the where clause due to ORM constraints.
does this work for you?
select * from purchaseorders
where (case when IsNumeric(purchase_order_number) = 1
then cast(purchase_order_number as int)
else 0 end) >= 7
You can do a select with a subselect
select * from (
select * from purchaseorders
where IsNumeric(purchase_order_number) = 1) as correct_orders
where cast(purchase_order_number as int) >= 7
try this:
select * from purchaseorders
where try_cast(purchase_order_number as int) >= 7
have to check which column has numeric values only.
Currently, in a table every field is setted with nvarchar(max) Like tableName (field1 nvarchar(max),field2 nvarchar(max),field3 nvarchar(3)) and tableName has 25lac Rows.
But on manually Check Field2 Contain the numeric Values Only... How to Check With t-sql that in the Complete Column (Field2) has numeric Value or not/null value with Longest Length in the Column!

SQL Server: Cannot insert an explicit value into a timestamp column

When using this statement
create table demo (
ts timestamp
)
insert into demo select current_timestamp
I get the following error:
Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column
How do I insert the current time to a timestamp column?
According to MSDN, timestamp
Is a data type that exposes automatically generated, unique binary
numbers within a database. timestamp is generally used as a mechanism
for version-stamping table rows. The storage size is 8 bytes. The
timestamp data type is just an incrementing number and does not
preserve a date or a time. To record a date or time, use a datetime
data type.
You're probably looking for the datetime data type instead.
If you have a need to copy the exact same timestamp data, change the data type in the destination table from timestamp to binary(8) -- i used varbinary(8) and it worked fine.
This obviously breaks any timestamp functionality in the destination table, so make sure you're ok with that first.
You can't insert the values into timestamp column explicitly. It is auto-generated. Do not use this column in your insert statement. Refer http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx for more details.
You could use a datetime instead of a timestamp like this:
create table demo (
ts datetime
)
insert into demo select current_timestamp
select ts from demo
Returns:
2014-04-04 09:20:01.153
How to insert current time into a timestamp with SQL Server:
In newer versions of SQL Server, timestamp is renamed to RowVersion. Rightly so, because timestamp name is misleading.
SQL Server's timestamp IS NOT set by the user and does not represent a date or a time. Timestamp is only good for making sure a row hasn't changed since it's been read.
If you want to store a date or a time, do not use timestamp, you must use one of the other datatypes, like for example datetime, smalldatetime, date, time or DATETIME2
For example:
create table foo (
id INT,
leet timestamp
)
insert into foo (id) values (15)
select * from foo
15 0x00000000000007D3
'timestamp' in mssql is some kind of internal datatype. Casting that number to datetime produces a nonsense number.
Assume Table1 and Table2 have three columns A, B and TimeStamp. I want to insert from Table1 into Table2.
This fails with the timestamp error:
Insert Into Table2
Select Table1.A, Table1.B, Table1.TimeStamp From Table1
This works:
Insert Into Table2
Select Table1.A, Table1.B, null From Table1
There is some good information in these answers. Suppose you are dealing with databases which you can't alter, and that you are copying data from one version of the table to another, or from the same table in one database to another. Suppose also that there are lots of columns, and you either need data from all the columns, or the columns which you don't need don't have default values. You need to write a query with all the column names.
Here is a query which returns all the non-timestamp column names for a table, which you can cut and paste into your insert query. FYI: 189 is the type ID for timestamp.
declare #TableName nvarchar(50) = 'Product';
select stuff(
(select
', ' + columns.name
from
(select id from sysobjects where xtype = 'U' and name = #TableName) tables
inner join syscolumns columns on tables.id = columns.id
where columns.xtype <> 189
for xml path('')), 1, 2, '')
Just change the name of the table at the top from 'Product' to your table name. The query will return a list of column names:
ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate
If you are copying data from one database (DB1) to another database(DB2) you could use this query.
insert DB2.dbo.Product (ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate)
select ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate
from DB1.dbo.Product
create table demo (
id int,
ts timestamp
)
insert into demo(id,ts)
values (1, DEFAULT)