how to do a distinct with select all [closed] - sql

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I am trying to select all fields and get a distinct in 1 field where a certain condition is true but I am getting an error saying incorrect syntax this is what I have
var sql = #"SELECT * distinct threadID from Threadposts where profileID = 1";
I am new to mssql but can not figure out what is wrong with the query above, I simply want all fields included where profileID= 1 and select distinct values from threadID

You need to be clearer about what you want. You are querying a tabled called Threadposts for records where the profileID is 1. This will return multiple rows with different values I expect.
Are you wanting to count how many posts were made by that person? Are you wanting a list of threads by that person?
-- count of rows
SELECT COUNT(*)
FROM Threadposts
WHERE profileID = 1
-- list of threads
SELECT *
FROM Threadposts
WHERE profileID = 1
If you are wanting something different then you'll need to update your question.
PS: the DISTINCT keyword will look at the data returned and give distinct values only, e.g. if you wanted distinct topics posted by this user regardless of if they created multiple threads with the same name:
SELECT DISTINCT ThreadTopic
FROM Threadposts
WHERE profileID = 1
Using DISTINCT * almost never makes sense, since each row will have a unique ID (hopefully) so will already be distinct.

DISTINCT is essentially short-hand for GROUP BY on all selected columns when you don't need any aggregates. What you are asking for is a query where you are grouping on a single column, but not aggregating the remaining columns. That doesn't make sense.

In a table, a column may contain many duplicate values; and sometimes you only want to list the different (distinct) values. The DISTINCT keyword can be used to return only distinct (different) values.
You want to select all the columns but distinct only with a particular one (threadID)
Try using:
var sql = #"SELECT DISTINCT ON threadID * FROM Threadposts WHERE profileID = 1;

Related

sql generate group on related groups [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 4 years ago.
Improve this question
Sorry, if question unclear, i had misstakes it first tables. I made some updates:
Database: PostgreSQL
I want to group table based on transition (if a=b & b=c then a=c)
Adding a pair (4,c) will merge 2 groups to one "group1".
i assume u want a.b.c to be group1 and the d as group2..
the groupby will work perfectly fine with aliases..
but the number of group op wants is 3 millions groups so a stored proc with a incremental in the end and group by will work fine..
From your comments, it looks like you want to find out transitive relationship.
You can do that with following query. But if the goal here is just to identify the relationship among different groups with their respective id, i guess you can afford to have groups which are not getting incremented with 1.
According to your given example in OP, i think it won't affect you if end result has group1 and group5 instead of group2.
If mention result is fine then you can do that with following updated query. Giving group names in successive manner will impact on query performance which you don't want as you've 3 million of groups.
Please try following query:
select t1.id, concat('group', min(t2.minId)) groups
from t1
join
(select min(id) minId, groups
from t1
group by groups
) t2
on t1.groups = t2.groups
join (select #cnt := 1)y
group by t1.id;
Demo : Click here

Remove null values in SQL server [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
Hello, Does anuone knows how can I remowe the null values corresponding to the description of the same product key? So, I have one product Key and its description in each language.
I'm trying to use the coalesce function, but it doesnt return me anything.
It looks like you want to combine the rows together for each ProductKey.
So instead of 5 lines, each with a single column populated, you want one line, with all 5 columns populated.
Do it like this:
Select Distinct T.ProductKey, C1.Column1, C2.Column2, C3.Column3 from MyTable T
left join MyTable C1 on C1.ProductKey = T.ProductKey and C1.Column1 is not null
left join MyTable C2 on C2.ProductKey = T.ProductKey and C2.Column2 is not null
left join MyTable C3 on C3.ProductKey = T.ProductKey and C3.Column3 is not null
Just replace "MyTable" above with your table name, and "Column1, Column2, Column3" with the names of the columns your data is in.
Pretend that each column is on its own separate table, and you need to use joins to connect all the tables back to your master set of ProductKeys.
Think about it in sets:
Basically you are going to make one master list of the keys that is distinct/unique (step 1), and then do a new left join for each column you want to attach to the master list (step 2), and as part of the joins, tell it to get the non-NULL values and ignore the NULLs.
you can use GROUP BY as below.
SELECT ProductKey,
MAX(C_ar_description) AS C_ar_description,
MAX(C_en_description) AS C_en_description,
MAX(C_fr_description) AS C_fr_description
FROM YourTable
GROUP BY ProductKey
You should use the results to fix the data so you dont need to do this every time.

SQL clause to find certain pairs in a select [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 6 years ago.
Improve this question
So I've run a SELECT which gave me this result so far:
These two columns are from different tables I've joined together. Both are stored as Numbers. In this case "ID" is the main entity and ID_1 describes a state that "ID" can be in. A main entity can have multiple states at once and multiple entities can be in the same state at the same time.
Right now, my select shows ALL entity-state-pairs on my DB. My goal for the final result is to show the rows for any entity that does not have at least one entry with their state set to 1 or 9. In the above example, I would like the final results to show the rows with the following IDs: 62 and 82
Any idea on how to archive this?
Thanks in advance!
You can use an outer join to accomplish this by doing something akin to
SELECT DISTINCT t1.ID
FROM TABLE_1 ti
LEFT OUTER JOIN (SELECT t2.ID
FROM TABLE_2 t2
WHERE t2.ID_1 IN (1, 9))
WHERE t2.ID IS NULL;
This will get the ID's from the second table where ID_1 is 1 or 9:
SELECT ID
FROM second_table
WHERE ID_1 IN (1, 9)
Using that, you can select from the first table where the ID isn't in the result set above:
SELECT DISTINCT ID
FROM first_table
WHERE ID NOT IN (
SELECT ID
FROM second_table
WHERE ID_1 IN (1, 9)
);
If you have a scenario where, for example, ID 63 has three records in the second table with ID_1 values of 3, 4 and 6, the SELECT DISTINCT will make sure ID 63 only shows once in the results instead of three times.
Addendum
Also see the answer from Bob Jarvis. The query is more involved but returns the same results. More importantly, it will run a lot faster for larger datasets.

on the basis of one condition try to pick data from another field and then pull the data on the basis of second value [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 8 years ago.
Improve this question
I have a table where date, transaction id, amount is available. "transaction id"s are numeric and alpha-numeric. First I need to check the first case where "transaction id" starts with a particular letter and then I need to pull the "date" for that particular "transaction id". Then according to that particular "date" I need to pull transaction data. Please help me how to do this.
You can use an EXISTS clause to check for the date in a subquery like so.
This will return all transactions that occurred on a date that had a transaction_id starting with the letter N
SELECT *
FROM some_table st
WHERE EXISTS
( SELECT 1
FROM some_table st1
WHERE st1.date = st.date
AND st1.transaction_id LIKE 'N%'
)
FIDDLE DEMO
these can also use an index on transaction_id which can speed things up
You can find date(s) for transactionId, that starts with; lets say 'A':
SELECT date FROM your_table WHERE transactionId LIKE 'A%';
Now you may have multiple records as you are searching with 'LIKE', then according to the date(s) you can fetch data from your table as:
SELECT * FROM your_table WHERE date = '2014-12-25 10:40:00';
But if you know your transactionId accurately, then following query will be sufficient.
SELECT * FROM your_table WHERE transactionId = 'A1001';

How can I apply distinct on multiple columns [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
Hi friends I have table from customer where in I want to get distinct values of its three columns CustomerType, CustomerReg,CustomerID.
Instead of doing three separate queries for the distinct
like select distinct CustomerType From Customer.. and then for CustomerReg..Can it be achieved in one query...
The reason is that i would attach each column distinct values to a specific drop down list box..
You can do this with grouping sets. If you want the values in three separate columns:
select CustomerType, CustomerReg, CustomerId
from Customer
group by grouping sets ((CustomerType), (CustomerReg), (CustomerId))
If I understand correctly, you want to show a distinct list of all the customer types, customerreg and customerIds in a list, in one column?
Try this...
select distinct CustomerType + ' : ' + CustomerReg + ' (' + CustomerId + ')' as Name
from Customer
This will return a string like 'External : 23423412 (2344)'
You should probably order it by something meaningful too.
Try adding
order by Name
Although, you shouldn't need the DISTINCT if a customer can only appear once in the customer table.
Reading your question again, it looks like you want to return a distinct list of each column in one query, not a distinct combination? Then the group by grouping sets mentioned above will probably get you the closest, although depending on the structure of your data, performance might become an issue here if you have lots of customers.
What language are you using in your UI?
If it's .Net, you could open a datareader using 3 separate queries, and then use the datareader.nextresult
There's an explanation here,
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.data.framework.datareader.nextresult.aspx
and an example here,
http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx
Hope that helps
You can even do it like this:
select distinct CustomerType, CustomerReg, CustomerId
from Customer