2016-03-22 16 views
0

[OK]をクリックしてガイドに従います。これはテーブルスクリプト+いくつかのテーブルです。2つのテーブルが結合して別のテーブルを持つSQLステートメント

+-------------+-------------------------------+--------------+-------+ 
| description |  ProductOmschrijving  | ProductPrijs | Total | 
+-------------+-------------------------------+--------------+-------+ 
| 112-112  | grp-sec-spla-office-eng  | 10.12  |  9 | 
| 114-114  | grp-sec-spla-office-prof-2016 | 5.45   |  8 | 
+-------------+-------------------------------+--------------+-------+ 

しかし、私は取得する必要があります:クエリと

USE [tempdb] 
GO 

CREATE TABLE [dbo].[table1](
    [cn] [nvarchar](1024) NULL, 
    [member] [nvarchar](1024) NULL, 
    [description] [nvarchar](1024) NULL, 
    [Date] [datetime] NULL, 
     [IsArchived] [bit] null 
) 

GO 


CREATE TABLE [dbo].[table2](
    [cn] [nvarchar](1024) NULL, 
    [member] [nvarchar](1024) NULL, 
    [description] [nvarchar](1024) NULL, 
    [Date] [datetime] NULL, 
     [IsArchived] [bit] null 
) 

GO 


CREATE TABLE [dbo].[table4](
    [cn] [nvarchar](1024) NULL, 
    [member] [nvarchar](1024) NULL, 
    [description] [nvarchar](1024) NULL, 
    [Date] [datetime] NULL, 
     [IsArchived] [bit] null 
) 

GO 

CREATE TABLE [dbo].[table3](
    [ID] [int] not NULL, 
    [ProductID] [nvarchar](1024) NULL, 
    [ProductOmschrijving] [nvarchar](1024) NULL, 
    [ProductPrijs] [money] NULL, 
) 

GO 

INSERT INTO table1 VALUES ('grp-sec-spla-office','john; chris; jack; marc;','112-112','', ''); 
INSERT INTO table1 VALUES ('grp-sec-spla-office-prof','jack; marc;','114-114','', ''); 
INSERT INTO table2 VALUES ('grp-sec-spla-office','cees; klaas','112-112','', ''); 
INSERT INTO table2 VALUES ('grp-sec-spla-office-prof','jan; piet','114-114','', ''); 
INSERT INTO table4 VALUES ('grp-sec-spla-office-prof','jack; marc;','114-114','', ''); 
INSERT INTO table4 VALUES ('grp-sec-spla-office','piet; ellen','112-112','', ''); 
INSERT INTO table4 VALUES ('grp-sec-spla-visio','henk; alwin','112-116','', ''); 
INSERT INTO table3 VALUES (1,'112-112','grp-sec-spla-office-eng','10.12'); 
INSERT INTO table3 VALUES (2,'114-114','grp-sec-spla-office-prof-2016','5.45'); 
INSERT INTO table3 VALUES (3,'112-116','grp-sec-spla-visio-blabla','7.12'); 
INSERT INTO table3 VALUES (4,'112-118','grp-sec-ac-office-sta-eng','2.45'); 
INSERT INTO table3 VALUES (5,'112-120','grp-sec-ac-office-pro-eng','2,50'); 
GO 

私の結果は

+-------------+-------------------------------+--------------+-------+ 
| description |  ProductOmschrijving  | ProductPrijs | Total | 
+-------------+-------------------------------+--------------+-------+ 
| 112-112  | grp-sec-spla-office-eng  | 10.12  |  9 | 
| 114-114  | grp-sec-spla-office-prof-2016 | 5.45   |  8 | 
| 112-116  | grp-sec-spla-visio-blabla  | 7.12   |  2 | 
| 112-118  | grp-sec-ac-office-sta-eng  | 2.45   |  0 | 
| 112-120  | grp-sec-ac-office-pro-eng  | 250.00  |  0 | 
+-------------+-------------------------------+--------------+-------+ 

は、これが今の私が使用するクエリです:

SELECT 
    table1.description, 
    table3.ProductOmschrijving, 
    table3.ProductPrijs, 
    sum((isnull(LEN(table1.member) - LEN(REPLACE(table1.member, ';', '')),-1) + 1) + 
     isnull(LEN(table2.member) - LEN(REPLACE(table2.member, ';', '')),-1) + 1 + 
     isnull(LEN(table4.member) - LEN(REPLACE(table4.member, ';', '')),-1) + 1) AS Total 
FROM table1 
inner join table3 ON table1.description = table3.ProductID 
left outer join table2 ON table1.description = table2.description 
AND table2.IsArchived = 0 
left outer join table4 on table1.description = table4.description 
and table4.IsArchived = 0 
where table1.IsArchived = 0 
GROUP BY table1.description 
    , ProductOmschrijving 
    , ProductPrijs 

table1、table2、table4は変更可能です(特にmember fiフィールド)。後で(将来的に)新しいテーブル5をクエリに追加すると、結果は同じになる必要がありますが、メンバーだけを結果に追加する必要があります。新しいテーブルにメンバーがいなくても。

もっと明確ですか?あなたの時間と助けに感謝します。

iは表3(商品テーブル)はもちろんの先頭テーブルでなければならないことを理解全体のポストを作った

Ahhghh。だから私は、table1の代わりにtable3から行くようにクエリを編集しました。いいえ、それは完璧に動作しています!

SELECT 
    table3.ProductID, 
    table3.ProductOmschrijving, 
    table3.ProductPrijs, 
    sum((isnull(LEN(table1.member) - LEN(REPLACE(table1.member, ';', '')),-1) + 1) + 
     isnull(LEN(table2.member) - LEN(REPLACE(table2.member, ';', '')),-1) + 1 + 
     isnull(LEN(table4.member) - LEN(REPLACE(table4.member, ';', '')),-1) + 1) 
     AS Total 
FROM table3 
left join table1 ON table3.productid = table1.description 
and table1.IsArchived = 0 
left join table2 ON table3.productid = table2.description 
AND table2.IsArchived = 0 
left join table4 on table3.productid = table4.description 
and table4.IsArchived = 0 
GROUP BY table3.productid 
    , ProductOmschrijving 
    , ProductPrijs 

と結果:

+-----------+-------------------------------+--------------+-------+ 
| ProductID |  ProductOmschrijving  | ProductPrijs | Total | 
+-----------+-------------------------------+--------------+-------+ 
| 112-112 | grp-sec-spla-office-eng  | 10.12  |  9 | 
| 112-116 | grp-sec-spla-visio-blabla  | 7.12   |  2 | 
| 112-118 | grp-sec-ac-office-sta-eng  | 2.45   |  0 | 
| 112-120 | grp-sec-ac-office-pro-eng  | 250.00  |  0 | 
| 114-114 | grp-sec-spla-office-prof-2016 | 5.45   |  8 | 
+-----------+-------------------------------+--------------+-------+ 
+0

不足している列はクエリには含まれません。それらはサブクエリにありますが、メインクエリにはありません。 –

+0

こんにちは、ショーン、私は知っている。しかし、私はそれらを追加するときにエラーが発生します。メッセージ4104、レベル16、状態1、行12 マルチパート識別子「Product.ProductOmschrijving」はバインドできませんでした。 – viest

+0

ちょうどあなたがエラーを起こすと言ってもそれほど役に立ちません。エラーが何であるかを説明すると役に立つでしょう。この場合、私はそれがグループにも追加していないからだと思う。 –

答えて

0

あなたは、列のリストとGROUP BYでそれらを含める必要があり、既存のクエリにそれらを追加します。

SELECT SUM(table1_total + table2_total) AS Total, 
     description 
     , ProductOmschrijving 
     , ProductPrijs 
FROM (
    SELECT 
     table1.description, 
     table3.ProductOmschrijving, 
     table3.ProductPrijs, 
     table1.IsArchived, 
     LEN(table1.member) - LEN(REPLACE(table1.member, ';', '')) + 1 AS table1_total, 
     LEN(table2.member) - LEN(REPLACE(table2.member, ';', '')) + 1 AS table2_total 
    FROM table1 
    INNER JOIN table3 ON table1.description = table3.ProductID 
    LEFT OUTER JOIN table2 ON table1.description = table2.description 
) a 
GROUP BY description 
    , ProductOmschrijving 
    , ProductPrijs 

このようにこのクエリを大幅に簡略化することができます。

SELECT 
    table1.description, 
    table3.ProductOmschrijving, 
    table3.ProductPrijs, 
    --table1.IsArchived, --don't think this is required??? 
    sum(LEN(table1.member) - LEN(REPLACE(table1.member, ';', '')) + 1 + LEN(table2.member) - LEN(REPLACE(table2.member, ';', '')) + 1) AS Total 
FROM table1 
INNER JOIN table3 ON table1.description = table3.ProductID 
LEFT OUTER JOIN table2 ON table1.description = table2.description 
GROUP BY description 
    , ProductOmschrijving 
    , ProductPrijs 
関連する問題