0

SQLServerでカスタムレポートを1つ作成する必要があります。ProductsTableというテーブルが1つあります。このテーブルには、価格の製品テーブルがあります。

| id | description |
| 1  |   TABLE A   |
| 2  |   TABLE B   |
| 3  |   TABLE C   |
| 4  |   TABLE D   |

これで、すべての製品の価格と彼のテーブルを含むテーブルProductsTablePricesができました。

| id | idproduct | idtable | price |
| 1  | 1         | 1       | 1.00  |
| 1  | 1         | 2       | 1.50  |
| 1  | 1         | 3       | 2.00  |
| 1  | 1         | 4       | 5.00  |

そして最後に、Productsテーブルがあります。

| id |   name   |
| 1  | Paper    |

このような結果を得るには、1つの選択を作成する必要があります...

| name  | TABLE A | TABLE B | TABLE C | TABLE D |
| Paper |  1.00   |   1.50  |   2.00  |   5.00  |

ありがとう!

4

2 に答える 2

1

これを試して:

SELECT
   P.name,
   SUM(CASE WHEN PT.description = 'TABLE A' THEN PP.price END) [TABLE A],
   SUM(CASE WHEN PT.description = 'TABLE B' THEN PP.price END) [TABLE B],
   SUM(CASE WHEN PT.description = 'TABLE C' THEN PP.price END) [TABLE C],
   SUM(CASE WHEN PT.description = 'TABLE D' THEN PP.price END) [TABLE D]
FROM Products P
   JOIN ProductsTablePrices PP
      ON P.id = PP.idproduct
   JOIN ProductsTable PT
      ON PP.idtable = PT.id
GROUP BY P.name
于 2013-01-31T18:10:08.620 に答える
0

私はそれを使って問題を解決します。

DECLARE @NameColumnTable VARCHAR(100)
DECLARE @CountColumns INT
DECLARE @ColumnsPivot varchar(6000)
DECLARE @Flag INT

SELECT @CountColumns = count(*) FROM ProductsTable
SET @Flag = 0

WHILE (@Flag <= @CountColumns)
BEGIN
    SELECT @NameColumnTable = Name FROM ProductsTable
    WHERE id = @Flag
    ORDER BY Name ASC

    SET @ColumnsPivot = ISNULL(@ColumnsPivot,'') + 'SUM(CASE WHEN PT.description = ''' + @NameColumnTable + ''' THEN PP.price END) [' + @NameColumnTable + ']'

    IF @Flag <> @CountColumns
    BEGIN
      SET @ColumnsPivot = @ColumnsPivot + ','
    END

    SET @ColumnsPivot = @ColumnsPivot + CHAR(13)

SET @Flag = @Flag + 1
END

DECLARE @SQLFINAL VARCHAR(5000)

SET @SQLFINAL = 'SELECT  
                   P.name,
                   ' + @ColumnsPivot + '
                FROM Products P
                JOIN ProductsTablePrices PP
                    ON P.id = PP.idproduct
                JOIN ProductsTable PT
                    ON PP.idtable = PT.id
                GROUP BY P.name
                ORDER BY P.name'
EXEC(@SQLFINAL)

それが良い習慣かどうかはわかりませんが、うまく機能し、パフォーマンスも向上します。

ありがとう!

于 2013-01-31T20:23:34.783 に答える