Display 240 Pictures, 9 per Page in SQL - sql-server

I have the code bellow:
SELECT *,
(ROW_NUMBER() OVER (ORDER BY person_id) -1 )/3 AS RowGrpNo,
(ROW_NUMBER() OVER (ORDER BY person_id) -1 )%3 AS ColGrpNo,
(ROW_NUMBER() OVER(ORDER BY person_id)-1)/9 AS PageGrpNo
FROM
(
SELECT DISTINCT
People.person_id,
People.ActivePassive,
PeoplePicture.person_id,
PeoplePicture.picture_id,
PeoplePicture.Picture
FROM People
Right Join PeoplePicture
On People.person_id = PeoplePicture.person_id
WHERE People.ActivePassive = 'Active'
)t​
In addition I have 240 images. I want to display them in SSRS (9 images per page). But I only get the first three as shown below:
Sample picture
How do I make the remaining 6 pictures visible, they where suppose to be where there are boxes in red. Please help.
Bellow is the report in report builder 3.0:

It can be achieved by doing the following:
Modify your inner select to include a rownumber column. This is simply to number your rows from 1 through to how many ever is returned in your dataset.
On your outer select, add another column (lets call it row_display).. set this to be rownumber % 3 -- since you want 3 images per line.
Now in your report designer, place 3 tablix of the same dimensions side by side to hold the photos
Lets call them tablix1, tablix2 and tablix3
they all display the same data.. except, each tablix has a different set of filters.
On tablix1, add a filter and set row_display = 1
On tablix2, add a filter and set row_display = 2
On tablix3, add a filter and set row_display = 0
You may need to adjust the size of the tablix depending on how many images are returned per page..
Preview the report and watch the magic happen.. hopefully.
Additionally. if you did another rownumber and call it pagebreak.. set this pagebreak column to increment by 1 every 9 rows .. you can then group all the tablix by the pagebreak column add a pagebreak between each instance of the group.. you would get 3 images across and 9 lines of images..

Related

Update Row Order Category wise in SQL

I have two table Images and Category in SQL Database. The Images images contains imageorder column which right now contains random order, so I wanted to do is re-arrange that order starting from 1 and so on but it should be category wise.
For example, Category table contains Twowheeler and Fourwheeler categories and Images table contains 10 rows out of 4 rows for Twowheeler and 6 rows for Fourwheeler.
SO, imageorder column should update like 1,2,3,4 for Twowheeler and 1,2,3,4,5,6 for Fourwheeler.
It should be something like this:
WITH DataSource AS
(
SELECT *
,ROW_NUMBER() OVER(PARTITION BY categoryid ORDER BY imageOrder) rowID
FROM Images
)
UPDATE IMages
SET ImageOrder = DS.rowID
FROM Images I
INNER JOIN DataSoruce DS
ON I.ImageId = DS.ImageID;
The idea is to use ROW_NUMBER to order the images. We are using PARTITION BY because we want to reset the order for each category. Also, we need to use a Common Table Expression to store this data and then to use it in the INNER JOIN statement - we are not allowed to use ROW_NUNMBER function directly in UPDATE statement.

Getting top 20 rows and the rest in 21st row in an SSRS Matrix Report

I want top 20 rows from an SSRS Matrix report and rest of the rows should be aggregated in 21st row with the row name hard coded as “Others”.
I have created the SSRS Matrix Report with row grouping based on "Category_Name" and Column grouping based on "Creation_Time". Column Group "Creation_Time" is formatted to show date in "M/yyyy" format. I am aggregating the “Id_Number” as Count(Id_Number) for each grouping and I want top 20 records sorted by count(Id_Number) in highest to the lowest order or descending order.
I have set the visibility condition as showed in the image:
I have given the following expression for the row "Others"
=count(iif(RunningValue(Fields!Category_Name.Value,countdistinct,nothing)>20,Fields!Id_Number.Value,0)
But it didn't work. I got the error saying "Running functions cannot be specified as nested aggregates".
I have earlier tried using TOP N filter on SSRS Row grouping based on count(Id_Number) which gives Top 20 rows.But if we add the " group total" to the row grouping, it will give the total of all rows and not just the top 20 rows. The logic that I thought of was to subtract the total of top 20 rows from the total of all rows. But I am not able to get the total of top 20 rows.
I used basic sql query with 2 parameters, #Begin AND #End :
SELECT Category_Name, Id_Number, Creation_Date
FROM Tbl
WHERE Creation_Date BETWEEN #Begin AND #End
The desired output of this report is this:
I am getting everything as per the desired output except for the last row "Others".
Amend your sql select script to include the following:
CASE WHEN ROW_NUMBER() OVER (ORDER BY SUM(Id_Number)DESC) >20 then 'Top 20' else 'Others' End AS 'Type'
Then in your report add in another separate tablix that is filtered by "type" = "others"

How to find the most frequently occurring value in SSRS tablix dataset?

Consider following dataset that is displayed in tablix in SSRS report:
GroupID | ProductID
---------------------
Group 1 | Product1
Group 2 | Product10
Group 1 | Product2
Group 3 | Product27
Group 2 | Product12
Group 2 | Product14
I added new row via Insert Row/Outside Group - Below.
On this row I display total number of rows - achieved via CountRows(), number of distinct Groups - achieved via =CountDistinct(Fields!GroupID.Value)
I also want to display the name of the group with the most number of rows, in this case it would be "Group 2" (in case if there is more than one group with the same number of rows I only need to display one of them).
How can this be achieved? I think I should use some of aggregate or lookup functions but so far can't figure out how.
PS This report is being ported from Crystal Reports to SSRS. In Crystal Reports this is easily achieved via "Nth most frequent" summary with N=1 but there is nothing like this in SSRS as far as I can tell.
Add a tablix and set GroupId as Row Group.
For Rows Count use:
=Count(Fields!GroupID.Value)
Right click GroupID group in the Row Groups pane and go to group properties, in the Filters tab use the following settings:
For Expression use:
=Count(Fields!GroupID.Value)
It will filter the top 1 group with the greatest Rows count. The result is something like this:
UPDATE: The previous solution doesn't work if there is more than one group with the same number of occurencies.
Add a tablix, delete the details (default group) and add the GroupID field in the first column.
For the Rows Count column use the following expression replacing DataSetName by the actual name of your dataset:
=LookupSet(
Fields!GroupID.Value,
Fields!GroupID.Value,
Fields!GroupID.Value,
"DataSetName"
).Length
Right click your tablix and go to tablix properties, in the Sorting tab select Z to A order and use the previous expression in the Sort By textbox.
It should show the only one group even if a second group with same number of occurencies is present.
Let me know if this helps.

SSRS multi axis chart issue

I was wondering if anyone can help me with this issue I have been having for at least a good 10 hours now after playing with it. I am going to use the Movies database from wiseowl to illustrate this instead.
I have the following SQL:
SELECT FilmReleaseDate
,FilmName
,directorname
,FilmRunTimeMinutes
,directorgender
,CountryName
,datename(M, FilmReleaseDate) AS [month]
,month(FilmReleaseDate) AS [month_no]
,year(FilmReleaseDate) AS [Year]
FROM tblFilm
INNER JOIN tblDirector ON directorID = FilmDirectorID
INNER JOIN tblCountry ON FilmCountryID = CountryID
WHERE FilmReleaseDate >= '2006-01-01'
now say I want to put this into a stacked chart with the movies from each country, the second axis will show the running minutes of the films. But the problem here is that I want the average for all countries, not for each one. Is there any way to do this so I have 1 line rather then 3 lines.
here is how the out put looks like
as you can see from output there are 3 lines for the 3 countries in the result, is there a way to get an average for all of them in one line rather then each one so the output will have only one line showing the average.
If anyone can help I will really appreciate it as I have spent countless hours on this. Any other info you need let me know.
Try this script. Then use the new field D.AVGFilmRunTimeMinutes on your chart. I added aliases on each table on the script. Just correct the aliases if they're pointing to a wrong table.
SELECT A.FilmReleaseDate
,A.FilmName
,B.directorname
,D.AVGFilmRunTimeMinutes
,B.directorgender
,C.CountryName
,datename(M, A.FilmReleaseDate) AS [month]
,month(A.FilmReleaseDate) AS [month_no]
,year(A.FilmReleaseDate) AS [Year]
FROM tblFilm A
INNER JOIN tblDirector B ON directorID = A.FilmDirectorID
INNER JOIN tblCountry C ON A.FilmCountryID = B.CountryID
LEFT JOIN (SELECT AVG(FilmRunTimeMinutes) AS AVGFilmRunTimeMinutes,FilmDirectorID FROM tblFilm GROUP BY FilmDirectorID) D
ON D.FilmDirectorID = A.FilmDirectorID
WHERE A.FilmReleaseDate >= '2006-01-01'
The reason your chart is producing 3 lines instead of one, is due to the grouping in you chart for each month (determined by how many countries).
I don't know the structure of your table, so I would recommend adding another field to your dataset:
YEAR(A.FilmReleaseDate) * 100 + MONTH(A.FilmReleaseDate) AS [YearMonth]
This will add a field with the format YYYYMM
Add this to your chart on your axis instead year and month_no.
In the Chart Data window, click the drop down next to the newly created Category Group for Year Month. Select Chart Group Properties, and copy the name. (It should be called something like - Chart1_CategoryGroup)
The final step is to modify the expression for your Film Run Time in the chart.
Click on the drop down next to FilmRunTimeMinutes, and click Series Properties.
In the value field use the following:
=Avg(Fields!FilmRunTimeMinutes.Value,"Chart1_CategoryGroup1")
Replacing Chart1_CategoryGroup1 with what your Category Group is called.

MSSQL Comparing rows same table

Hi im looking to compare several rows and check if a certain condition is true/false.
The tables has several columns the ones im interested in are:
Events.Badgeno
Events.Name
Events.Date
Events.Time
Events.Region_id
Events.Data
The region ID can either be 1 or 2.
I want to check weather the same badgeno registers with a different region within a specified date/time difference say 10 mins. (Could be 10 mins before or 10 mins after).
I'm looking to show the records which don't have a record against the 2 regions.
As a further note it should only be within the first and last records of that badge per day.
Normally each record should have a region 1 and 2 record at the start and end. But there maybe multiple region 1's through out the day.
Any suggestions for the best method?
Id Date Time Name Badgeid Region
3385033 27/02/2014 08:16:11 FirstName Surname 5304 2
I think something like this would work
SELECT e.Badgeno,e.Name, e.Date, e.Time,e.Region_id, e.Data
FROM events e
INNER JOIN events e1 ON e1.BadgeNo = e.BadgeNo AND e1.Region_id <> e.RegionId AND DATEDIFF(minutes,e1.date + e1.time,e.date + e.time) > -10 AND DATEDIFF(minutes,e1.date + e1.time,e.date + e.time) < 10
WHERE e1.Region_id IS NULL
you should provide sample data.
This Query is not complete,you can try something with
row_number/rank/dense, partition and check thus number column
generated .
select *,
row_number()over(partition by badgeno,regionno order by badge no)rn from table
where condition of date time

Resources