2016-10-28 29 views
-1

我有一個表書籍SQL使用像捧場

NAME 
    A 
    B 
    C 

和另一Booksassignment

ID ASSIGNMENTTEXT 
1  Book.Assigned.To:A 
2  Book.Assigned.To:A 
3  Book.Assigned.To:B 
4  Book.Assigned.To:B 
5  Book.Assigned.To:C 
6  Book.Assigned.To:A 
7  OtherText:A 

我想多少書籍被分配到每個人如

我應該得到

Person  Bookcount 
A    3 
B    2 
C    1 

我只想讓那些行,其中Book.Assigned.To:NAME

我一直在使用字符串嘗試,但我解決不了

謝謝,

艾登

+1

Mysql或Sql-Server? – NEER

+0

可怕的設計。 ASSIGNMENTTEXT部件有單獨的列。 – jarlh

回答

0

如果名稱列的長度總是1,你可以爲以下:

SELECT 
    B.Name AS Person, 
    COUNT(1) Bookcount 
FROM 
    Books B INNER JOIN 
    Booksassignment BA ON B.NAME = BA.RIGHT(ASSIGNMENTTEXT, 1) 
GROUP BY 
    B.Name 
+0

我想要做這樣的書籍AS ( SELECT DISTINCT名字從圖書 ) SELECT DISTINCT Books.Books,COUNT()從書本 LEFT OUTER JOIN BookAssignment ON Books.NAME = BookAssignment。ASSIGNMENTTEXT – Aiden

1

您可以使用內部聯接和GROUP BY

select a.Name, b.count(*) 
from Books a 
inner join Booksassignment b on b.ASSIGNMENTTEXT like concat('%:', a.NAME) 
group by a.Name 
+0

謝謝我會試試 – Aiden

+0

意味着我concat書的名稱與Book.Assigned.To – Aiden

+0

@Aiden ..不意味着a.Name(人名我想)與%wildchar和thi%連接:NAME是比較與喜歡運算符的字符串Book.AssingnedTo:...... ..這應該與concat模式匹配 – scaisEdge

0

試試這個:

;WITH T AS 
(
    SELECT 
     Id, 
     REPLACE(AssignmentText,SUBSTRING(AssignmentText,0, CHARINDEX(':',AssignmentText,0)+1),'') AS AssignedName 
    FROM @tblBooksassignment 
) 
SELECT 
    B.Name, 
    COUNT(T.Id) AS 'PersonBookCount' 
FROM T 
INNER JOIN @tblBooks B ON B.Name=T.AssignedName 
GROUP BY B.Name 

輸出:

enter image description here

0
CREATE TABLE #T(nAME varchar(25)) 
INSERT INTO #T 
SELECT 'A' UNION ALL 
SELECT 'B' UNION ALL 
SELECT 'C' 

CREATE TABLE #tt (Id int,Book Varchar(25),Name Varchar(255)) 
INSERT INTO #tt 
SELECT 1,'Book.Assigned','A' UNION ALL 
SELECT 2,'Book.Assigned','A' UNION ALL 
SELECT 3,'Book.Assigned','B' UNION ALL 
SELECT 4,'Book.Assigned','B' UNION ALL 
SELECT 5,'Book.Assigned','C' UNION ALL 
SELECT 6,'Book.Assigned','A' 


SELECT #tt.Name,COUNT(#tt.Name) from #tt INNER JOIN #T 
ON #t.Name=#tt.Name 
GROUP BY #tt.Name 
0

我覺得這樣的事情會工作

SELECT B.NAME, 
     COUNT(*) as Bookcount 

    FROM Books B 

    JOIN Booksassignment BA 
    ON B.NAME = SUBSTRING(BA.ASSIGNMENTTEXT, -1) 
    AND BA.ASSIGNMENTTEXT LIKE 'Book.Assigned.To:%' 

GROUP BY B.NAME 
+0

意味着我想用戶SUBSTRING在Book的名稱與Book.Assigned.To – Aiden

0

如果名稱是百達在ASSIGNMENTTEXT欄的末尾使用right功能

select name, count(*) from Books b 
    inner join Booksassignment a on b.name like RIGHT(a.ASSIGNMENTTEXT, 1) 
where ASSIGNMENTTEXT like 'Book.Assigned.To:%' 
group by name 

更新應答 如果您需要第一列爲「Book.Assigned.To:」:

select ASSIGNMENTTEXT, count(*) from Books b 
     inner join Booksassignment a on b.name like RIGHT(a.ASSIGNMENTTEXT, 1) 
where ASSIGNMENTTEXT like 'Book.Assigned.To:%' 
group by ASSIGNMENTTEXT 

例:

with Books as (select * from (select 'A' as name union select 'B' union select 'C') as b) 
, Booksassignment as (
    select * from (
     select 1 as iD, 'Book.Assigned.To:A' ASSIGNMENTTEXT union 
     select 2, 'Book.Assigned.To:A' union 
     select 3, 'Book.Assigned.To:B' union 
     select 4, 'Book.Assigned.To:B' union 
     select 5, 'Book.Assigned.To:C' union 
     select 6, 'Book.Assigned.To:A' 
    ) as c 
) 
select name, count(b.name) as ASSIGNMENTs from Books b 
    inner join Booksassignment a on b.name like RIGHT(a.ASSIGNMENTTEXT, 1) 
group by name 
+0

我想包括Book.Assigned。收件人: – Aiden

+0

意味着我將書籍的名稱與Book.Assigned.To一起concat: – Aiden

+0

Book.Assigned.To:將始終到達,AssignmentText中可能有其他文本。例如ABCD.DEF :.所以我想只有那些行Book.Assigned.To:NAME – Aiden

0

我想它在MySQL:

SELECT CONCAT(SUBSTRING(o.ASSIGNMENTTEXT,-1),」」,COUNT(ASSIGNMENTTEXT))FROM Booksassignment鄰GROUP BY ASSIGNMENTTEXT

+0

我想使用書的SUBSTRING NAME與Book.AssignedTo:並將它連接到每行 – Aiden

+0

好的.................. –